文本相似性算法实现(二)-分组及分句热度统计
JMeter-完成批量的接口测试
1. 场景形貌
软件老王在上一节引见到类似性热度统计的4个需求(),本次引见分组及分组分句热度统计(需求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('nr').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('nr').replace('n', '').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包,。
(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('nr').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 | 噪音太大 | 2 | |
软件老王1 | 声响太大 | 1 | |
软件老王2 | 自检报错或死机 | 1 | |
软件老王2 | 机械噪音大 | 1 | |
软件老王2 | 声响太大 | 1 | |
软件老王3 | 噪音问题 | 1 | |
软件老王3 | 声响太大 | 1 |
(3)简朴申明
从数据中能够看出来,比方:声响太大,分属三类,起首分类,然后再比对类似性。
I’m 「软件老王」,假如以为还能够的话,关注下呗,后续更新秒知!迎接讨论区、同名民众号留言交换!
进阶之路 | 巧妙的Animation之旅