• 文本相似性算法实现(二)-分组及分句热度统计


    1. 场景描述

    软件老王在上一节介绍到相似性热度统计的4个需求(文本相似性热度统计(python版)),本次介绍分组及分组分句热度统计(需求1和需求2)。

    2. 解决方案

    分组热度统计首先根据某列进行分组,然后再对这些句进行热度统计,主要是分组处理,分句仅仅是按照标点符号做了下拆分,在代码说明中可以替换下就可以了。

    2.1 完整代码

    完整代码,有需要的朋友可以直接拿走,不想看代码介绍的,可以直接拿走执行就行。

    import jieba.posseg as pseg
    import jieba.analyse
    import xlwt  # 写入Excel表的库
    import pandas as pd
    from gensim import corpora, models, similarities
    import re
    #停词函数
    def StopWordsList(filepath):
        wlst = [w.strip() for w in open(filepath, 'r', encoding='utf8').readlines()]
        return wlst
    def str_to_hex(s):
        return ''.join([hex(ord(c)).replace('0x', '') for c in s])
    # jieba分词
    def seg_sentence(sentence, stop_words):
        stop_flag = ['x', 'c', 'u', 'd', 'p', 't', 'uj', 'f', 'r']
        sentence_seged = pseg.cut(sentence)
        outstr = []
        for word, flag in sentence_seged:
            if word not in stop_words and flag not in stop_flag:
                outstr.append(word)
        return outstr
    if __name__ == '__main__':
        # 1 这些是jieba分词的自定义词典,软件老王这里添加的格式行业术语,格式就是文档,一列一个词一行就行了,
        # 这个几个词典软件老王就不上传了,可注释掉。
        jieba.load_userdict("g1.txt")
        jieba.load_userdict("g2.txt")
        jieba.load_userdict("g3.txt")
    
        # 2 停用词,简单理解就是这次词不分割,这个软件老王找的网上通用的。
        spPath = 'stop.txt'
        stop_words = StopWordsList(spPath)
    
        # 3 excel处理
        wbk = xlwt.Workbook(encoding='ascii')
        sheet = wbk.add_sheet("软件老王sheet")  # sheet名称
        sheet.write(0, 0, '软件老王1-类别')
        sheet.write(0, 1, '软件老王2-原因')
        sheet.write(0, 2, '软件老王3-统计数量')
        sheet.write(0, 3, '导航-链接到明细sheet表')
    
        inputfile = '软件老王-source2.xlsx'
        data = pd.read_excel(inputfile)  # 读取数据
        grp1 = data.groupby('类别')
        rcount = 1
        for name, group in grp1:
            print(grp1)
            texts = []
            orig_txt = []
            key_list = []
            name_list = []
            sheet_list = []
            name = name.replace('
    ', '').replace('/', '')
            for i in range(len(group)):
                row = group.iloc[i].values
                cell = row[1]
                if cell is None:
                    continue
                if not isinstance(cell, str):
                    continue
                item = cell.strip('
    
    ').split('	')
                string = item[0]
                if string is None or len(string) == 0:
                    continue
                else:
                    textstr = seg_sentence(string, stop_words)
                    texts.append(textstr)
                    orig_txt.append(string)
            # 4 相似性处理
            dictionary = corpora.Dictionary(texts)
            feature_cnt = len(dictionary.token2id.keys())
            corpus = [dictionary.doc2bow(text) for text in texts]
            tfidf = models.LsiModel(corpus)
            index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=feature_cnt)
            result_lt = []
            word_dict = {}
            count =0
            for keyword in orig_txt:
                count = count+1
                print('开始执行,第'+ str(count)+'行')
                if keyword in result_lt or keyword is None or len(keyword) == 0:
                    continue
                kw_vector = dictionary.doc2bow(seg_sentence(keyword, stop_words))
                sim = index[tfidf[kw_vector]]
                result_list = []
                for i in range(len(sim)):
                    if sim[i] > 0.5:
                        if orig_txt[i] in result_lt and orig_txt[i] not in result_list:
                            continue
                        result_list.append(orig_txt[i])
                        result_lt.append(orig_txt[i])
                if len(result_list) >0:
                    word_dict[keyword] = len(result_list)
                if len(result_list) >= 1:
                    name = name.strip('
    
    ').replace('
    ', '').replace('/', '').replace(',', '').replace('。', '').replace(
                        '*', '')
                    name = re.sub(u"([^u4e00-u9fa5u0030-u0039u0041-u005au0061-u007a])", "", name)
                    sname = name[0:10] + '_' + re.sub(u"([^u4e00-u9fa5u0030-u0039u0041-u005au0061-u007a])", "", keyword[0:10])+ '_'
                            + str(len(result_list)+ len(str_to_hex(keyword))) + str_to_hex(keyword)[-5:]
                    sheet_t = wbk.add_sheet(sname)  # Excel单元格名字
                    for i in range(len(result_list)):
                        sheet_t.write(i, 0, label=result_list[i])
            # 5 按照热度排序 -软件老王
            with open("rjlw.txt", 'w', encoding='utf-8') as wf2:  # 打开文件
                orderList = list(word_dict.values())
                orderList.sort(reverse=True)
                count = len(orderList)
                for i in range(count):
                    for key in word_dict:
                        if word_dict[key] == orderList[i]:
                            key_list.append(key)
                            name_list.append(name)
                            word_dict[key] = 0
                wf2.truncate()
            # 6 写入目标excel
            for i in range(len(key_list)):
                sheet.write(i+rcount, 0, label=name_list[i])
                sheet.write(i+rcount, 1, label=key_list[i])
                sheet.write(i+rcount, 2, label=orderList[i])
                if orderList[i] >= 1:
                    shname = name_list[i][0:10] + '_' + re.sub(u"([^u4e00-u9fa5u0030-u0039u0041-u005au0061-u007a])", "", key_list[i][0:10]) 
                             + '_'+ str(orderList[i]+ len(str_to_hex(key_list[i])))+ str_to_hex(key_list[i])[-5:]
                    link = 'HYPERLINK("#%s!A1";"%s")' % (shname, shname)
                    sheet.write(i+rcount, 3, xlwt.Formula(link))
            rcount = rcount + len(key_list)
            key_list = []
            name_list = []
            orderList = []
            texts = []
            orig_txt = []
            sheet_list =[]
        wbk.save('软件老王-target2.xls')  
    

    2.2 代码说明

    以上的代码中有很明确的注释就不再一一介绍了,重点说几个。

    (1)分组处理跟文本相似性热度统计算法实现(一)-整句热度统计相似,不同的是首先按照某一列做了分组处理,然后进行相似性统计,相似性这块一样,其实不同的主要是excel处理这块的内容。

    (2)excle分组用的是pandas包,python中excel数据分组处理

    (3)关于需求2,分组分句,代码如下:

     for i in range(len(group)):
                row = group.iloc[i].values 
                cell = row[1]
                if cell is None:
                    continue
                if not isinstance(cell, str):
                    continue
                item = cell.strip('
    
    ').split('	') 
                string = item[0]
                #软件老王,这里按照标点符号对原因进行拆分,然后再进行处理。
                lt = re.split(',|。|!|?', string)
                for t in lt:
                    if t is None or t.strip() == '' or len(t.strip()) == 0:
                        continue
                    else:
                        textstr = seg_sentence(t, stop_words)
                        texts.append(textstr)
                        orig_txt.append(t)
    

    2.3 效果图

    (1)软件老王-source2.xlsx

    类别 原因
    软件老王1 主机不能加电
    软件老王1 有时不能加电
    软件老王1 开机加电
    软件老王2 自检报错或死机
    软件老王2 机器噪音大
    软件老王3 噪音问题
    软件老王1 噪音太大
    软件老王1 噪音噪声
    软件老王1 声音太大
    软件老王2 声音太大
    软件老王3 声音太大

    (2)软件老王-target2.xls

    软件老王1-类别 软件老王2-原因 软件老王3-统计数量 导航-链接到明细sheet表
    软件老王1 主机不能加电 3 软件老王1_主机不能加电_2707535
    软件老王1 噪音太大 2 软件老王1_噪音太大_18a5927
    软件老王1 声音太大 1 软件老王1_声音太大_17a5927
    软件老王2 自检报错或死机 1 软件老王2_自检报错或死机_29b673a
    软件老王2 机器噪音大 1 软件老王2_机器噪音大_2135927
    软件老王2 声音太大 1 软件老王2_声音太大_17a5927
    软件老王3 噪音问题 1 软件老王3_噪音问题_17e9898
    软件老王3 声音太大 1 软件老王3_声音太大_17a5927

    (3)简单说明

    从数据中可以看出来,例如:声音太大,分属三类,首先分类,然后再比对相似性。


    I’m 「软件老王」,如果觉得还可以的话,关注下呗,后续更新秒知!欢迎讨论区、同名公众号留言交流!

  • 相关阅读:
    【HDU2050】折线分割平面
    【Codevs1183】泥泞的道路
    Pair
    【Poj 1832】连环锁
    【Poj1090】Chain
    【UVa 10881】Piotr's Ants
    【Codeforces】665E Beautiful Subarrays
    【T^T】【周赛】第一周周赛——欢迎16级的新同学
    【OI新闻】2016.10.09
    二分图的最大匹配
  • 原文地址:https://www.cnblogs.com/ruanjianlaowang/p/12404035.html
Copyright © 2020-2023  润新知