经过整整一天的不懈奋斗,我终于破解了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/
转载文章受原作者版权保护。转载请注明原作者出处!