通過公司名稱獲取公司關鍵詞


一 問題詳情

類似天眼查的公司詳情頁,如果公司有自己的圖標,就會顯示公司圖標:

如果沒有圖標,則會提取其關鍵詞,配合背景色作為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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM