gensim进阶:TFIDF模型训练以及查找具体词汇的tfidf值

经过整整一天的不懈奋斗,我终于破解了gensim的语料导入!

首先把完整的训练模型和保存的代码放上:

from gensim import models
from gensim import corpora
from gensim.models import TfidfModel

with open("文件.txt","r",encoding='utf-8') as f:
    txts = eval(f.read())  # 用eval()把字符串化的列表还原为列表

dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
# print(corpus)
tf_idf_model = TfidfModel(corpus, normalize=False)
models.TfidfModel.save(tf_idf_model,'tfidf')         # 保存tfidf模型
with open('词典.txt', 'a', encoding='utf-8')as f1:
    f1.write(str(dictionary.token2id))               # 保存dictionary
with open('词频.txt', 'a', encoding='utf-8')as f2:
    f2.write(str(corpus))                            # 保存corpus

从训练好的模型中查询特定文本中特定词汇:

# 加载tfidf模型
tfidf = TfidfModel.load(r"0117tfidfnew")

# 查找tfidf
word_tf_tdf = list(tfidf[[(int(id), int(tf))]])
value = word_tf_tdf[0][1]

这里参考的是博文:(感谢大佬!大海捞针般的找到这一篇,非常有用!)python gensim 中 TF-IDF 的计算方法_iszhuangsha的博客-CSDN博客_gensim tf-idf

引入:基本概念

看了很多大佬写的gensim详解,首先要了解三个最简单基础的概念:导入语料(texts)、dictionary和corpus。

# 导入语料的格式(多个文本)
texts = [['文本1'],['文本2'],['文本3'],……,]]

# texts转换为gensim中进行计算的dictionary和corpus
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

dictionary是一个字典,其中包含了出现在全部文本中的所有词的id,一个词只有一个id,从0开始编号。

corpus是一个元组嵌套列表,表示了每个文本中词语对应的id及词频。

# dictionary的格式
dictionary  = {"词语1":"id1","词语2":"id2","词语3":"id3",……,"词语n":"idn"}

# corpus的格式
corpus = [[(文本1第1个词的id),(文本1第1个词的tf),(文本1第2个词的id),(文本1第2个词的tf),……,(文本1第n个词的id),(文本1第n个词的tf)],……,]]

特定词语tfidf查询原理

在已经保存好的tfidf模型中查询在特定文本中的特定词语的tfidf,需要进行好几次映射:

①从dictionary中查询词语的id

②从corpus中按照文件和id查询词语的tf(词频)

③按照(id,tf)的格式从模型中提取该词汇的tfidf值

我的解决方法非常粗暴:将dictionary和corpus重新编辑为一个嵌套词典,格式为:

idTfDict = {
"第1个文本的名称.txt":{"第1个词语的id":"第1个词语的tf值",……,"第n个词语的id":"第n个词语的tf"},
"第2个文本的名称.txt":{"第1个词语的id":"第1个词语的tf值",……,"第p个词语的id":"第p个词语的tf"},
……
"第m个文本的名称.txt":{"第1个词语的id":"第1个词语的tf值",……,"第q个词语的id":"第q个词语的tf"}
}

实现的代码是:

(顺带一提,如果corpus特别大(比如我自己导出的corpus有600多兆),直接使用eval()可能报错memory error,需要先将corpus进行几次拆分,再还原为列表,可参考我的另一篇博文gensim中corpus的列表化还原|大型嵌套列表字符串转为原列表_Yae Yang的博客-CSDN博客

# 获取文本名称列表,作为idTF词典新的key
import os
file_list = os.listdir(r"存放多个文本的文件夹路径")

with open("词频.txt","r",encoding = "utf-8") as f:
    corpus = f.read()
    corpus_list = eval(corpus)

# 将两个列表合并为dictionary
idTfDict = dict(zip(file_list,corpus_list))

实现查询功能:

最后,实现先从词汇-id词典中查找id,再从id-tf词典中查找tf,再分别填入(id,tf)查找tfidf:

# 先用词语-id词典查找id
with open(r"C:\Users\27805\PycharmProjects\pythonProject3\词典new.txt", 'r+', encoding='utf-8') as f2:
    ids = eval(f2.read())  # id词典
    id = ids['词语']

# 用json读取id词频,查询tf
with open(r"C:\Users\27805\PycharmProjects\pythonProject3\idTf
Dict.txt",'r',encoding='utf-8') as f1:
    cont = f1.read()
    dic = json.loads(cont)
    tf = dic['文本.txt'][id]
tfidf = TfidfModel.load("tfidf")
word_tf_tdf = list(tfidf[[(int(id),int(tf))]])

  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gensim tfidf similarity 是指使用gensim库来计算文本之间的tf-idf相似度。 tf-idf(Term Frequency-Inverse Document Frequency)是一种常用的文本特征表示方法,它将一个文档中的词权重化,同时考虑了词频和在其他文档中的出现频率。tf-idf能够帮助我们衡量一个词在一个文档中的重要性。 在gensim库中,我们可以使用`TfidfModel`来计算文本的tf-idf。 首先,我们需要将文本转换成gensim的`Corpus`对象,以便进行处理。列如,我们有一组文本数据`documents`,我们可以将其转换为`Corpus`对象: ```python from gensim import corpora # 将文本数据转化为Corpus对象 documents = [["我", "爱", "中国"], ["中国", "爱", "我"], ["我", "喜欢", "足球"]] dictionary = corpora.Dictionary(documents) corpus = [dictionary.doc2bow(doc) for doc in documents] ``` 然后,我们使用`TfidfModel`来计算tf-idf: ```python from gensim.models import TfidfModel # 计算tf-idf tfidf_model = TfidfModel(corpus) tfidf = tfidf_model[corpus] ``` 最后,我们可以使用`cosine_similarity()`函数来计算文本之间的相似度。例如,我们计算第一篇文档和其他文档的相似度: ```python from sklearn.metrics.pairwise import cosine_similarity # 计算文档之间的相似度 index = similarities.MatrixSimilarity(tfidf) similarity = index[tfidf[0]] ``` 其中,`cosine_similarity()`函数使用的是余弦相似度来度量文档之间的相似度。 通过上述方法,我们可以使用gensim库中的tf-idf模型来计算文本之间的相似度,并得到一个相似度矩阵。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值