关于Excel表操作-通过gensim实现模糊匹配

2022-05-19 12:26:12 浏览数 (2)

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%的结果可信度还是比较高的

0 人点赞