一 問題詳情
類似天眼查的公司詳情頁,如果公司有自己的圖標,就會顯示公司圖標:
如果沒有圖標,則會提取其關鍵詞,配合背景色作為logo:
現在要思考的問題:如何從給定的完整公司名稱里提取公司關鍵詞。這屬於從本文里獲取公司名稱之后的后續問題了。
二 分析問題
大部分公司名稱的組成分為以下幾個部分
地區\名稱\公司類型
江西五維實業有限公司
深圳康泰生物制品股份有限公司
所以何為關鍵詞:不同地方的定義不同,在公司名稱里,能代表公司的詞為其關鍵詞。比如羅永浩的錘子,人們不需要知道其公司全稱,一個“錘子”足矣。
第一步要做的是進行帶有詞性標注的分詞,去除地名和代表公司類型的詞。在詞性標注方面,hanlp效果要優於jieba。
hanlp 的詞性對照表:
https://blog.csdn.net/u014258362/article/details/81044286
地點(ns)和機構后綴(nis)都可以標注出來。如下面代碼所示,
from pyhanlp import *
string = "錫林郭勒地震應急保障中心"
words = [_.toString() for _ in HanLP.segment(string)]
print(words) # ['錫林郭勒/ns', '地震/n', '應急/vn', '保障/vn', '中心/nis']
第二步:對預處理之后的詞語,按照一定規則進行合並。一般關鍵詞長度為4,比如瑞星咖啡;特殊情況為3,比如紅黃藍幼兒園的關鍵詞為“紅黃藍”。
三 代碼實現
3.1 加載地區名稱
from pyhanlp import *
import xlrd
filt_list = ['ns','nis']
def get_province_city():
xls_path = './tools/province.xls'
print(xls_path)
book = xlrd.open_workbook(xls_path)
sheet = book.sheets()[0]
name_ = list()
for r in range(1, sheet.nrows):
name = sheet.cell(r, 1).value
temp = get_keyword(name)
if temp:
name_.append(temp[0])
name_.append(temp[1])
# 獲取中國34個省級行政區及其下屬的地級市
city_list = get_province_city()
3.2 實現keyword類的兩個字符串處理方法
class KeyWord:
#判斷是否為英文,如果公司名稱里有英文,則直接把英文首字母作為logo內容
def is_english_char(self,ch):
if ord(ch) not in (97, 122) and ord(ch) not in (65, 90):
return False
return True
# 公司名稱有的帶有書名號和括號,需要預處理。同時在預處理階段去掉地區。
def process_word(self,word):
res = word.replace('《', '').replace('》', '')
index1 = res.find('(')
index2 = res.find(')')
temp = res[index1:index2 + 1]
res = res.replace(temp, '')
flag1 = res[:2]
flag2 = res[:3]
flag3 = res[:4]
if flag3 in city_list:
res = res.replace(flag3, '')
elif flag2 in city_list:
res = res.replace(flag2, '')
elif flag1 in city_list:
res = res.replace(flag1, '')
return res
3.3 關鍵詞提取實現過程:分詞+規則處理
def extract(self,name):
if self.is_english_char(name[0]):
final_key = name[0]
return final_key
final_key = False
name_type_dict = dict()
name = self.process_word(name)
words = [_.toString() for _ in HanLP.segment(name)]
filt_key = list()
key_list = list()
for word in words:
key, flag = word.split('/')
name_type_dict[key] = flag
key_list.append(key)
if flag in filt_list:
filt_key.append(key)
for i in filt_key:
key_list.remove(i)
if len(key_list) == 1: # 候選詞列表只有一個單詞,看其長度是否<=4
if len(key_list[0]) <= 4:
final_key = key_list[0]
else:
final_key = self.extract_two(key_list[0])
# 當候選詞列表只有兩個詞語
elif len(key_list) == 2:
# 按設定規則處理
else: # 候選詞列表長度大於等於3
# 按設定規則處理
#如果經過上述處理過程,得到的關鍵詞長度為0或1,取分詞后的第一個詞作為關鍵詞
if not final_key or len(final_key)==1:
for item in name_type_dict.keys():
final_key = item
break
return final_key
3.4 當過濾之后的候選詞個數為2時
# 是英文,則用該英文作為返回值
k1 = key_list[0]
if name_type_dict[k1] == 'nx':
final_key = k1
# 如果第一個不是英文
else:
k2 = key_list[1]
if len(k1) == 1:
if len(k2) == 1:
final_key = k1 + k2 # 兩個單字,只能相加。
elif len(k2) == 2:
final_key = k1 + k2 # 三個字
elif len(k2) == 3:
final_key = k1 + k2 # 四個字
else:
temp = k1 + k2
final_key = temp[:4]
elif len(k1) == 2:
if len(k2) == 1 or len(k2)==2:
final_key = k1 + k2
else:
temp = k1 + k2
final_key = temp[:4]
# 如果第一個值長度為3,則最后的詞長度為3or4.
elif len(k1) == 3:
if len(k2) ==1:
final_key = k1 + k2
else:
if 'n' in name_type_dict[k1] :
final_key = k1
else:
final_key = k1 + k2[0]
elif len(k1) == 4:
final_key = k1 # 長度為四,則直接使用k1
else:
final_key = self.extract_two(k1)
3.5 當過濾之后的候選詞個數大於等於3時
# 當候選詞大於3個。
else:
if not key_list: # 沒有候選詞
pass
else:
k1 = key_list[0]
if name_type_dict[k1] == 'nx':
final_key = k1
else:
k2 = key_list[1]
k3 = key_list[2]
if len(k1) == 1: # 如果第一個單詞長度為1.則最終結果為3或者4.
if len(k2) == 1:
if len(k3) ==1 or len(k3)==2:
# 當第三個為1或者2,最終長度為3或者4
final_key = k1 + k2 + k3
else: # 最終長度為4
final_key = k1 + k2 + k3[:2]
elif len(k2) == 2:
if len(k3) >= 2:
final_key = k1 + k2
else:
final_key = k1 + k2 + k3
elif len(k2) == 3:
final_key = k1 + k2
elif len(k1) == 2: # 第一個單詞長度為2
if len(k2) == 1:
if len(k3) == 1:
final_key = k1 + k2 + k3
else:
final_key = k1 + k2
elif len(k2) == 2:
final_key = k1 + k2
else:
temp = k1 + k2
final_key = temp[:4]
elif len(k1) == 3:
if 'n' in name_type_dict[k1] :
final_key = k1
else:
if len(k2) == 1:
final_key = k1 + k2
else:
final_key = k1 + k2[0]
elif len(k1) == 4:
final_key = k1
else:
final_key = self.extract_two(k1)
四、源碼
https://github.com/timor1988/keyword-extract-from-company-name