当前位置:   article > 正文

自然语言处理(NLP)之使用TF-IDF模型计算文本相似度_基于ti-idf模型的文本相似度

基于ti-idf模型的文本相似度

自然语言处理(NLP)之使用TF-IDF模型计算文本相似度

所用数据集:ChnSentiCorp_htl_all.csv
语料库即存放稀疏向量的列表。
要注意的是,搜索文本text与被检索的文档共用一个特征词词典。

NLP计算文本相似度的方法,可以参考博文:https://blog.csdn.net/weixin_34101784/article/details/94639717

代码主要使用gensim库完成了分词、TF-IDF模型训练、文本相似度计算。
过程如下:

分词、建立特征词典、建立语料库、用TF-IDF模型处理语料库、计算搜索文本与被检索文本的相似度。
示例代码:

  1. import csv
  2. import jieba
  3. from gensim import corpora, models, similarities
  4. count = 0
  5. wordListTop10 = []
  6. with open('ChnSentiCorp_htl_all.csv', 'r', encoding='utf-8') as f:
  7. lines = csv.reader(f) # lines的类型是<class '_csv.reader'> 指向csv文件的第一行
  8. next(lines) # 指向csv文件的第二行 这个函数的参数是迭代器(iterator)和一个default
  9. # next(iterator, default)
  10. # default是迭代器已经到了最末端,再调用next()函数的输出值。不填这个参数的话,到了最末端还用next()的话会报错。
  11. for line in lines:
  12. # 只选取前10句话
  13. if count == 10:
  14. break
  15. segList = list(jieba.cut(line[1])) # 分词 jieba.cut(line[1])对每一行列表的第二个元素进行分词,类型是generator
  16. wordListTop10.append(segList) # 把前10句话的所有分词放进一个列表中,该列表为一个列表嵌套10个列表
  17. count += 1
  18. # print('/'.join(segList)) # '/'.join(segList)将segList即每句话的分词列表 转换成字符串,用’/‘将每个元素连接起来
  19. """
  20. 制作词袋模型(bag_of_word (bow))
  21. """
  22. # 制作字典
  23. dictionary = corpora.Dictionary(wordListTop10)
  24. # 可以通过token2id得到特征数字
  25. # print(dictionary.token2id)
  26. """
  27. 制作数字向量类型的语料库(doc2bow)
  28. """
  29. # ----> 将字符串转换成数字向量类型的词袋模型(稀疏向量)
  30. # 源文件不做处理是一个字符串类型的语料库
  31. corpus = [dictionary.doc2bow(doc) for doc in wordListTop10]
  32. def semblance(text, corpus):
  33. # 对测试文本分词
  34. dic_text_list = list(jieba.cut(text))
  35. # 制作测试文本的词袋
  36. doc_text_vec = dictionary.doc2bow(dic_text_list)
  37. # 获取语料库每个文档中每个词的tfidf值,即用tfidf模型训练语料库
  38. tfidf = models.TfidfModel(corpus)
  39. # 对稀疏向量建立索引
  40. index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary.keys()))
  41. sim = index[tfidf[doc_text_vec]] # 相当于sim = index.get_similarities(tfidf[doc_text_vec])
  42. print(sim)
  43. print(len(sim))
  44. # 按照相似度来排序
  45. sim_sorted = sorted(enumerate(sim, 1), key=lambda x: -x[1]) # enumerate(x, 1) 代表从1开始设立索引
  46. # 相当于sorted(enumerate(sim), key=lambda x: x[1], reverse=True
  47. print(sim_sorted)
  48. # for e,s in enumerate(sim,1):
  49. # print('text 与 doc%d 相似度为:%.6f' % (e, s))
  50. if __name__ == '__main__':
  51. text = '这个商务大床房,感觉还不错'
  52. semblance(text, corpus)

运行结果:

  1. [0. 0.46778572 0.11295232 0.01399767 0. 0.05849655
  2. 0.01257649 0.01730035 0.03707163 0.09614414]
  3. 10
  4. [(2, 0.46778572), (3, 0.11295232), (10, 0.09614414), (6, 0.058496553), (9, 0.037071627), (8, 0.017300347), (4, 0.013997675), (7, 0.012576494), (1, 0.0), (5, 0.0)]

可以看到,text与数据集中第二条语句相似度最高。

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

闽ICP备14008679号