zoukankan      html  css  js  c++  java
  • 通过公司名称获取公司关键词

    一 问题详情

    类似天眼查的公司详情页,如果公司有自己的图标,就会显示公司图标:

    如果没有图标,则会提取其关键词,配合背景色作为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)
    
  • 相关阅读:
    Python注释及变量
    MySQL期末测试
    SQL查询第三次训练(重点关照对象)
    MySQL内置函数
    聚类-kmeans
    《达.芬奇密码》丹-布朗
    皮克定理与证明
    常见设计模式的种类与一些原则
    时间序列(二)分解、各部分计算方法
    ADF检验
  • 原文地址:https://www.cnblogs.com/leimu/p/13212235.html
Copyright © 2011-2022 走看看