文字相似性演算法實現(二)-分組及分句熱度統計
阿新 • • 發佈:2020-03-03
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('\n', '').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('\n\r').split('\t') 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('\n\r').replace('\n', '').replace('/', '').replace(',', '').replace('。', '').replace( '*', '') name = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "", name) sname = name[0:10] + '_' + re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\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-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\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('\n\r').split('\t') 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 「軟體老王」,如果覺得還可以的話,關注下唄,後續更新秒知!歡迎討論區、同名公眾號留言交流