python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Gensim

Python基于Gensim实现文本相似度/匹配/查重

作者:小龙在山东

Gensim是基于Python语言的自然语言处理库,用来主题建模、文本相似度等文本处理任务,下面我们就来看看如何使用Gensim实现文本相似度/匹配/查重等操作吧

Gensim是基于Python语言的自然语言处理库,用来主题建模、文本相似度等文本处理任务。

Gensim的工作流程包括:分词、生成词典、向量化、模型训练等。

LSI模型

import jieba
from gensim import corpora, models, similarities

# 文本数据集
data = ['张文宏谈为何这个冬天总生病',
        '“为什么这个冬天我们好像一直在生病?”张文宏这样说→']

# 分词
token_list = []
for sentence in data:
    tokens = [word for word in jieba.lcut(sentence)]
    token_list.append(tokens)
print(token_list)

# 词典,单词映射唯一ID
dic = corpora.Dictionary(token_list)

# 文本转化为文档-词袋(document-term)表示
corpus = [dic.doc2bow(doc) for doc in token_list]
print(corpus)

# 生成模型
lda_model = models.LsiModel(corpus, num_topics=2, id2word=dic)

# 主题及其词汇
for topic in lda_model.print_topics():
    print(topic)

# 索引
index = similarities.MatrixSimilarity(lda_model[corpus])

query = '为什么这个冬天我们好像一直在生病'

# 预处理
query_bow = dic.doc2bow(jieba.lcut(query))

# 相似性得分
sims = index[lda_model[query_bow]]

sims = sorted(enumerate(sims), key=lambda item: -item[1])

for document_id, similarity in sims:
    print(document_id, similarity)

TFIDF

方案一

import jieba
from gensim import corpora, models, similarities
if __name__ == '__main__':
    base_data = [
        "好雨知时节,当春乃发生。随风潜入夜,润物细无声。野径云俱黑,江船火独明。晓看红湿处,花重锦官城。",
        "君问归期未有期,巴山夜雨涨秋池。何当共剪西窗烛,却话巴山夜雨时。",
        "莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。",
        "天街小雨润如酥,草色遥看近却无。最是一年春好处,绝胜烟柳满皇都。",
        "古木阴中系短篷,杖藜扶我过桥东。沾衣欲湿杏花雨,吹面不寒杨柳风。",
        "少年听雨歌楼上。红烛昏罗帐。壮年听雨客舟中。江阔云低、断雁叫西风。 而今听雨僧庐下。鬓已星星也。悲欢离合总无情。一任阶前、点滴到天明。",
        "雨里鸡鸣一两家,竹溪村路板桥斜。妇姑相唤浴蚕去,闲看中庭栀子花。",
        "一夕轻雷落万丝,霁光浮瓦碧参差。有情芍药含春泪,无力蔷薇卧晓枝。"
    ]
    # 1.将base_data中的数据进行遍历后分词
    base_items = [[i for i in jieba.lcut(item)] for item in base_data]
    print(base_items)
    # 2.生成词典
    dictionary = corpora.Dictionary(base_items)
    # 3.通过doc2bow稀疏向量生成语料库
    corpus = [dictionary.doc2bow(item) for item in base_items]
    # 4.通过TF模型算法,计算出tf值
    tf = models.TfidfModel(corpus)
    # 5.通过token2id得到特征数(字典里面的键的个数)
    num_features = len(dictionary.token2id.keys())
    # 6.计算稀疏矩阵相似度,建立一个索引
    index = similarities.MatrixSimilarity(tf[corpus], num_features=num_features)
    # 7.处理测试数据
    test_text = "风雨凄凄,鸡鸣喈喈。既见君子,云胡不夷。风雨潇潇,鸡鸣胶胶。既见君子,云胡不瘳。风雨如晦,鸡鸣不已。既见君子,云胡不喜。"
    test_words = [word for word in jieba.cut(test_text)]
    print(test_words)
    # 8.新的稀疏向量
    new_vec = dictionary.doc2bow(test_words)
    # 9.算出相似度
    sims = index[tf[new_vec]]
    print(list(sims))

方案二

from jieba import lcut
from gensim.similarities import SparseMatrixSimilarity
from gensim.corpora import Dictionary
from gensim.models import TfidfModel
# 文本集和搜索词
texts = ['吃鸡这里所谓的吃鸡并不是真的吃鸡,也不是谐音词刺激的意思',
         '而是出自策略射击游戏《绝地求生:大逃杀》里的台词',
         '我吃鸡翅,你吃鸡腿']
keyword = '玩过吃鸡?今晚一起吃鸡'
# 1、将【文本集】生成【分词列表】
texts = [lcut(text) for text in texts]
# 2、基于文本集建立【词典】,并获得词典特征数
dictionary = Dictionary(texts)
num_features = len(dictionary.token2id)
# 3.1、基于词典,将【分词列表集】转换成【稀疏向量集】,称作【语料库】
corpus = [dictionary.doc2bow(text) for text in texts]
# 3.2、同理,用【词典】把【搜索词】也转换为【稀疏向量】
kw_vector = dictionary.doc2bow(lcut(keyword))
# 4、创建【TF-IDF模型】,传入【语料库】来训练
tfidf = TfidfModel(corpus)
# 5、用训练好的【TF-IDF模型】处理【被检索文本】和【搜索词】
tf_texts = tfidf[corpus]  # 此处将【语料库】用作【被检索文本】
tf_kw = tfidf[kw_vector]
# 6、相似度计算
sparse_matrix = SparseMatrixSimilarity(tf_texts, num_features)
similarities = sparse_matrix.get_similarities(tf_kw)
for e, s in enumerate(similarities, 1):
    print('kw 与 text%d 相似度为:%.2f' % (e, s))

方案三

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('\nTF-IDF模型的稀疏向量集:')
for i in tfidf[corpus]:
    print(i)
print('\nTF-IDF模型的keyword稀疏向量:')
print(tfidf[new_vec])
print('\n相似度计算:')
sim = index[tfidf[new_vec]]
for i in range(len(sim)):
    print('第', i+1, '句话的相似度为:', sim[i])

到此这篇关于Python基于Gensim实现文本相似度/匹配/查重的文章就介绍到这了,更多相关Python Gensim内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文