代码实现
效果不咋地,
原理见:
Python+gensim-文本相似度分析(小白进)_小基基o_O的博客-CSDN博客_python 文本相似度
3、过程拆解 3.1、生成分词列表 对文本集中的文本进行 中文分词,返回 分词列表,格式如下: [‘word1’, ‘word2’, ‘word3’, …] import jieba text = '七月七日长生殿,夜半无人私语时。' words = jieba.lcut(text) print(words) [‘七月’, ‘七日’, ‘长生殿’, ‘,’, ‘夜半’, ‘无人’, ‘私语’, ‘时’, ‘。’] 3.2、基于文本集建立词典,获取特征数 corpora.Dictionary:建立词典 len(dictionary.token2id):词典中词的个数 from gensim import corpora import jieba # 文本集 text1 = '坚果果实' text2 = '坚果实在好吃' texts = [text1, text2] # 将文本集生成分词列表 texts = [jieba.lcut(text) for text in texts] print('文本集:', texts) # 基于文本集建立词典 dictionary = corpora.Dictionary(texts) print('词典:', dictionary) # 提取词典特征数 feature_cnt = len(dictionary.token2id) print('词典特征数:%d' % feature_cnt) 打印结果 文本集: [[‘坚果’, ‘果实’], [‘坚果’, ‘实在’, ‘好吃’]] 词典: Dictionary(4 unique tokens: [‘坚果’, ‘果实’, ‘好吃’, ‘实在’]) 词典特征数:4 3.3、基于词典建立语料库 语料库即存放稀疏向量的列表
from gensim import corpora import jieba text1 = '来东京吃东京菜' text2 = '东京啊东京啊东京' texts = [text1, text2] texts = [jieba.lcut(text) for text in texts] dictionary = corpora.Dictionary(texts) print('词典(字典):', dictionary.token2id) # 基于词典建立新的【语料库】 corpus = [dictionary.doc2bow(text) for text in texts] print('语料库:', corpus) 打印结果 词典(字典): {‘东京’: 0, ‘吃’: 1, ‘来’: 2, ‘菜’: 3, ‘啊’: 4} 语料库: [[(0, 2), (1, 1), (2, 1), (3, 1)], [(0, 3), (4, 2)]] 3.3.1、doc2bow函数 1、将所有单词取【集合】,并对每个单词分配一个ID号 以 ['东京', '啊', '东京', '啊', '东京']为例 对单词分配ID: 东京→ 0; 啊→ 4 变成: [0, 4, 0, 4, 0] 2、转换成 稀疏向量 0有 3个,即表示为( 0, 3) 4有 2个,即表示为( 4, 2) 最终结果:[( 0, 3), ( 4, 2)] 3.3.2、搜索词也转成稀疏向量 from gensim import corpora import jieba text1 = '南方医院无痛人流' text2 = '北方人流落南方' texts = [text1, text2] texts = [jieba.lcut(text) for text in texts] dictionary = corpora.Dictionary(texts) # 用【词典】把【搜索词】也转换为【稀疏向量】 keyword = '无痛人流' kw_vector = dictionary.doc2bow(jieba.lcut(keyword)) print(kw_vector) [(0, 1), (3, 1)] 3.4、用语料库训练TF-IDF模型 TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度 from gensim import corpora, models, similarities import jieba text1 = '南方医院无痛人流' text2 = '北方人流浪到南方' texts = [text1, text2] texts = [jieba.lcut(text) for text in texts] dictionary = corpora.Dictionary(texts) feature_cnt = len(dictionary.token2id.keys()) corpus = [dictionary.doc2bow(text) for text in texts] # 用语料库来训练TF-IDF模型 tfidf = models.TfidfModel(corpus) print(tfidf) TfidfModel(num_docs=2, num_nnz=9) 3.5、相似度计算 from gensim import corpora, models, similarities import jieba text1 = '无痛人流并非无痛' text2 = '北方人流浪到南方' texts = [text1, text2] keyword = '无痛人流' texts = [jieba.lcut(text) for text in texts] dictionary = corpora.Dictionary(texts) num_features = len(dictionary.token2id) corpus = [dictionary.doc2bow(text) for text in texts] tfidf = models.TfidfModel(corpus) new_vec = dictionary.doc2bow(jieba.lcut(keyword)) # 相似度计算 index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features) print(' TF-IDF模型的稀疏向量集:') for i in tfidf[corpus]: print(i) print(' TF-IDF模型的keyword稀疏向量:') print(tfidf[new_vec]) print(' 相似度计算:') sim = index[tfidf[new_vec]] for i in range(len(sim)): print('第', i+1, '句话的相似度为:', sim[i])