当前位置:   article > 正文

gensim进阶:TFIDF模型训练以及查找具体词汇的tfidf值_corpus_list = eval(corpus)

corpus_list = eval(corpus)

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

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

  1. from gensim import models
  2. from gensim import corpora
  3. from gensim.models import TfidfModel
  4. with open("文件.txt","r",encoding='utf-8') as f:
  5. txts = eval(f.read()) # 用eval()把字符串化的列表还原为列表
  6. dictionary = corpora.Dictionary(texts)
  7. corpus = [dictionary.doc2bow(text) for text in texts]
  8. # print(corpus)
  9. tf_idf_model = TfidfModel(corpus, normalize=False)
  10. models.TfidfModel.save(tf_idf_model,'tfidf') # 保存tfidf模型
  11. with open('词典.txt', 'a', encoding='utf-8')as f1:
  12. f1.write(str(dictionary.token2id)) # 保存dictionary
  13. with open('词频.txt', 'a', encoding='utf-8')as f2:
  14. f2.write(str(corpus)) # 保存corpus

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

  1. # 加载tfidf模型
  2. tfidf = TfidfModel.load(r"0117tfidfnew")
  3. # 查找tfidf
  4. word_tf_tdf = list(tfidf[[(int(id), int(tf))]])
  5. value = word_tf_tdf[0][1]

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

引入:基本概念

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

  1. # 导入语料的格式(多个文本)
  2. texts = [['文本1'],['文本2'],['文本3'],……,]]
  3. # texts转换为gensim中进行计算的dictionary和corpus
  4. dictionary = corpora.Dictionary(texts)
  5. corpus = [dictionary.doc2bow(text) for text in texts]

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

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

  1. # dictionary的格式
  2. dictionary = {"词语1":"id1","词语2":"id2","词语3":"id3",……,"词语n":"idn"}
  3. # corpus的格式
  4. corpus = [[(文本11个词的id),(文本11个词的tf),(文本12个词的id),(文本12个词的tf),……,(文本1第n个词的id),(文本1第n个词的tf)],……,]]

特定词语tfidf查询原理

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

①从dictionary中查询词语的id

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

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

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

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

实现的代码是:

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

  1. # 获取文本名称列表,作为idTF词典新的key
  2. import os
  3. file_list = os.listdir(r"存放多个文本的文件夹路径")
  4. with open("词频.txt","r",encoding = "utf-8") as f:
  5. corpus = f.read()
  6. corpus_list = eval(corpus)
  7. # 将两个列表合并为dictionary
  8. idTfDict = dict(zip(file_list,corpus_list))

实现查询功能:

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

  1. # 先用词语-id词典查找id
  2. with open(r"C:\Users\27805\PycharmProjects\pythonProject3\词典new.txt", 'r+', encoding='utf-8') as f2:
  3. ids = eval(f2.read()) # id词典
  4. id = ids['词语']
  5. # 用json读取id词频,查询tf
  6. with open(r"C:\Users\27805\PycharmProjects\pythonProject3\idTf
  7. Dict.txt",'r',encoding='utf-8') as f1:
  8. cont = f1.read()
  9. dic = json.loads(cont)
  10. tf = dic['文本.txt'][id]
  1. tfidf = TfidfModel.load("tfidf")
  2. word_tf_tdf = list(tfidf[[(int(id),int(tf))]])

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/354434
推荐阅读
相关标签
  

闽ICP备14008679号