通过公司名称获取公司关键词
一、问题详情
类似天眼查的公司详情页,如果公司有自己的图标,就会显示公司图标:
如果没有图标,则会提取其关键词,配合背景色作为logo:
现在要思考的问题:如何从给定的完整公司名称里提取公司关键词。这属于从本文里获取公司名称之后的后续问题了。
二、分析问题
大部分公司名称的组成分为以下几个部分
地区\名称\公司类型
江西五维实业有限公司
深圳康泰生物制品股份有限公司
所以何为关键词:不同地方的定义不同,在公司名称里,能代表公司的词为其关键词。比如罗永浩的锤子,人们不需要知道其公司全称,一个“锤子”足矣。
第一步要做的是进行带有词性标注的分词,去除地名和代表公司类型的词。在词性标注方面,hanlp效果要优于jieba。如下面代码所示,
地点(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