gensim是一个Python的自然语言处理库,能够将文档根据TF-IDF,LDA,LSI等模型转换成向量模式,此外,gensim还实现了word2vec,能够将单词转换为词向量。
gensim的一些常见概念:
语料Corpus: 一组原始文本的集合,用于无监督地训练文本主题的隐层结构,语料中不需要人工标注的附加信息。在Gensim中,Corpus通常是一个可迭代的对象(比如列表)。每次迭代返回一个可用于表达文本对象的稀疏向量。
向量Vector: 由一组文本特征构成的列表,是一段文本在Gensim中的内容部表达。
稀疏向量SparseVector: 通常 我们可以略去向量中多余的0元素,此时向量中的每一个元素是一个(key,value)的tuple.
模型Model: 是一个抽象的术语,定义了两个向量空间的变换(即从文本的一种向量表达变换为另一种向量表达)
下面为相关代码,代码结构和前面的Fuzzywuzzy是类似的,不过执行起来,效率是前者的几十倍上百倍。
关于本文的步骤:
1、读取Excel表格
2、进行jieba分词
3、构建语料字典
4、通过doc2bow转换为稀疏向量
5、构建TfidfModel模型,进行训练
6、实现相似度查找
代码语言:javascript复制from gensim import corpora, similarities, models
import jieba
import pandas as pd
import datetime
filename=r'C:UsersbaoqiDocuments比较清单.xlsx'
targetfilename=r'C:UsersbaoqiDocuments目标文件.xlsx'
# A比B多 21409 CONT_NAME
# B比A多 3236 HTMC
# ---------------------------写入财务域比资产域多的非物资合同补充列-------------------
data = pd.read_excel(filename,sheet_name='B比A多',engine='openpyxl')
代码语言:javascript复制find= pd.read_excel(filename,sheet_name='B比A多',engine='openpyxl')
data_split_word = data.CONT_NAME.apply(jieba.lcut)
dictionary = corpora.Dictionary(data_split_word.values)
data_corpus = data_split_word.apply(dictionary.doc2bow)
find_corpus=find.HTMC.apply(lambda x:dictionary.doc2bow(jieba.lcut(x)))
tfidf = models.TfidfModel(data_corpus.to_list())
index = similarities.SparseMatrixSimilarity(
tfidf[data_corpus], num_features=len(dictionary))
result = []
for corpus in find_corpus.values:
sim = pd.Series(index[corpus])
result.append(['t'.join([str(s) for s in data.CONT_NAME[sim.nlargest(2).index].values]), '',
't'.join([str(s) for s in sim.nlargest(2).values]), ''])
result = pd.DataFrame(result)
result.rename(columns={0:'匹配值1',1:'匹配值2',2:'阈值1',3:'阈值2'}, inplace=True)
result = pd.concat([find, result], axis=1)
writer = pd.ExcelWriter(targetfilename, mode="w", engine="openpyxl")
result.to_excel(writer,index=False,sheet_name='匹配值')
writer.save()
writer.close()
通过实际测试,阈值70%的结果可信度还是比较高的