当前位置:   article > 正文

基于gensim TFIDF模型 的文章推荐算法_tfidf_model

tfidf_model

1. gensim.similarities.SparseMatrixSimilarity 的三个方法

2. TFIDF 源码浅析

3.  gensim使用之一 tfidf 和lsi

一  训练阶段     输入数据格式:一个列表,列表中的每个元素(也是列表)代表一个文本。每个文本分词后的词语组成的一个列表代表该文本。 生成的模型、tfidf矩阵、文章item_id列表,字典,语料分别保存。

gensim版本的TFIDF模型的创建分为一下5步:

  1. 1. 生成字典 dictionary = corpora.Dictionary(train)
  2. 2. 生成语料 corpus = [dictionary.doc2bow(text) for text in train]
  3. 3. 定义TFIDF模型 tfidf_model = models.TfidfModel(corpus, dictionary=dictionary)
  4. 4. 用语料训练模型并生成TFIDF矩阵 corpus_tfidf = tfidf_model[corpus]
  5. 5. 生成余弦相似度索引 index = similarities.SparseMatrixSimilarity(corpus_tfidf, num_features=featurenum) 使用SparseMatrixSimilarity(),可以占用更少的内存和磁盘空间。
  1. from gensim import corpora,similarities,models
  2. import jieba
  3. import pandas as pd
  4. import pickle
  5. stopwords = [line.strip() for line in open('./doc/stopword.txt', 'r',encoding='utf-8').readlines()]
  6. def chinese_word_cut(mytext):
  7. seg_list = []
  8. seg_text = jieba.cut(mytext)
  9. for word in seg_text:
  10. if word not in stopwords:
  11. seg_list.append(word)
  12. return " ".join(seg_list)
  13. df = pd.read_csv("./doc/corpora.csv",sep='\t',encoding='utf-8')
  14. t = pd.DataFrame(df['content'].astype(str))
  15. df["content"] = t['content'].apply(chinese_word_cut)
  16. train = []
  17. train_item_id = []
  18. for i in range(len(df["content"])):
  19. line = df["content"][i]
  20. line = line.split()
  21. train.append([w for w in line])
  22. train_item_id.append(df["item_id"][i])
  23. #print(len(train))
  24. #print(train)
  25. print(len(train))
  26. dictionary = corpora.Dictionary(train)
  27. corpus = [dictionary.doc2bow(text) for text in train]
  28. # corpus是一个返回bow向量的迭代器。下面代码将完成对corpus中出现的每一个特征的IDF值的统计工作
  29. tfidf_model = models.TfidfModel(corpus, dictionary=dictionary)
  30. corpus_tfidf = tfidf_model[corpus]
  31. dictionary.save('train_dictionary.dict') # 保存生成的词典
  32. tfidf_model.save('train_tfidf.model')
  33. corpora.MmCorpus.serialize('train_corpuse.mm', corpus)
  34. featurenum = len(dictionary.token2id.keys()) # 通过token2id得到特征数
  35. # 稀疏矩阵相似度,从而建立索引,我们用待检索的文档向量初始化一个相似度计算的对象
  36. index = similarities.SparseMatrixSimilarity(corpus_tfidf, num_features=featurenum)
  37. index.save('train_index.index')
  38. pickle.dump(train_item_id,'item_id.pkl')

二  测试阶段   模型对测试集进行operation;求余弦相似度。对于给定的新文本,找到训练集中最相似的五篇文章作为推荐。

代码说明

  1. 1 import warnings warnings.filterwarnings(action='ignore',category=UserWarning,module='gensim') 为了不报警告。
  2. 2 pickle.dump() 报错,需要有wirite属性。改为 from sklearn.externals import joblib。其dump 和load 方式和pickle一致。
  3. 3 index.get_similarities(test_vec) 返回test_vec 和训练语料中所有文本的余弦相似度。返回结果是个numpy数组
  4. 4 related_doc_indices = sim.argsort()[:-6:-1] 完成对numpy数组的排序并获取其top5最大值。

 

  1. import jieba
  2. from sklearn.externals import joblib
  3. import warnings
  4. warnings.filterwarnings(action='ignore',category=UserWarning,module='gensim')
  5. from gensim import corpora,similarities,models
  6. stopwords = [line.strip() for line in open('./doc/stopword.txt', 'r',encoding='utf-8').readlines()]
  7. def chinese_word_cut(mytext):
  8. seg_list = []
  9. seg_text = jieba.cut(mytext)
  10. for word in seg_text:
  11. if word not in stopwords:
  12. seg_list.append(word)
  13. return seg_list
  14. # 读取文章
  15. def readfile(path):
  16. fp = open(path, "r", encoding="utf-8")
  17. content = fp.read()
  18. fp.close()
  19. return content
  20. doc = readfile('doc/re0.txt')
  21. test = chinese_word_cut(doc)
  22. dictionary = corpora.Dictionary.load("train_dictionary.dict")
  23. tfidf = models.TfidfModel.load("train_tfidf.model")
  24. index = similarities.SparseMatrixSimilarity.load('train_index.index')
  25. item_id_list = joblib.load('item_id.pkl')
  26. corpus = corpora.MmCorpus('train_corpuse.mm')
  27. print('模型加载完成')
  28. # 产生BOW向量
  29. vec = dictionary.doc2bow(test)
  30. #生成tfidf向量
  31. test_vec = tfidf[vec]
  32. # 计算相似度
  33. sim = index.get_similarities(test_vec)
  34. related_doc_indices = sim.argsort()[:-6:-1]
  35. print(related_doc_indices)
  36. idlist = [] # 保存item_id
  37. for i in related_doc_indices:
  38. idlist.append(item_id_list[i])
  39. print(idlist)

 

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

闽ICP备14008679号