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]

看了很多大佬写的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,需要进行好几次映射:

①从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"}
}

实现的代码是:

获取文本名称列表,作为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))]])

Original: https://blog.csdn.net/weixin_51143561/article/details/122541859
Author: Yae Yang
Title: gensim进阶:TFIDF模型训练以及查找具体词汇的tfidf值

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528040/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球