
[307]python文本相似度计算
词典建立:将每篇文本分解为词语,构建一个映射表,键为词语,值为词语的编号。 向量化:将文本中的词语替换为其对应的编号,形成向量。例: 词频计算(TF):计算每个词在文本中的出现频率。 逆文档频率(IDF):计算每个词在整个文本集合中的倒数出现频率。 权重计算:每个词的权重为TF和IDF的乘积,权重越高表示该词更能反映文本内容。 向量化:使用TF-IDF值替换词袋模型中的词频,形成更具准确性的文本向量。 降维处理:将文本向量从高维(如几百或几千维)降低到较低维度(如主题数量),便于后续分析。 主题抽象:可以揭示文本的潜在主题分布,而不仅仅是具体的词语。 向量表示:使用上述模型将文本转化为向量形式,方便后续计算。 距离度量:选用欧氏距离、余弦相似度等度量方法,计算向量间的相似度。 停用词表:使用结巴分词工具对文本进行分词,同时剔除常见的停用词如标点符号、连接词等。 分词函数:将文本分解为有效词语,返回纯净的词语列表。 词袋模型:使用词典进行文本向量化。 TF-IDF模型:训练并生成权重较高的向量。 LSI模型:基于TF-IDF向量构建潜在主题模型。
发布日期:2021-05-16 09:25:13
浏览次数:19
分类:精选文章
本文共 2952 字,大约阅读时间需要 9 分钟。
文本相似度计算方法与实践
文本向量化方法
在文本分析领域,计算两篇中文文本的相似度通常需要将文本转化为向量形式。随着自然语言处理技术的发展,英语文本可以直接利用简单的分词方法,但中文文本由于繁繁复杂,处理起来尤为严峻。以下将介绍几种常用文本向量化方法,包括词袋模型、TF-IDF模型以及LSI模型。
词袋模型
词袋模型是将文本简化为一个词语袋中的词汇频数。每个词被赋予一个唯一的编号,整个文本就表示为这些编号组成的向量。词袋模型的特点是简单易懂,适用于语言模型的基础构建。
例子:
假设文本分别为:
- "John likes to watch movies. Mary likes too."
- "John also likes to watch football games."
词袋模型的构建过程如下:
- [1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
- [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]
TF-IDF模型
词袋模型在实际应用中存在不足。例如,在处理中文文本时,常见的无意义词语(如“的”、“是”、“有”等)会掩盖真正有意义的信息。TF-IDF模型通过为每个词赋予权重,解决了这一问题。
TF-IDF模型的构建步骤:
LSI模型
在TF-IDF模型的基础上,LSI模型(Latent Semantic Indexing,潜在语义指标)进一步引入了主题模型。LSI通过奇异值分解,将高维文本空间映射到低维主题空间,使得文本向量变得更易于分析和比较。
LSI模型的优点:
文本相似度计算
Python实现概述
分词与去除停用词
模型构建
实验案例
通过上述方法,运算系统可以更好地理解文本内容并计算相似度。使用词袋模型和TF-IDF模型,系统在高血压主题文本中的表现较为理想,但在主题分类效果上仍有提升空间。引入LSI模型后,系统能够更准确地区分高血压主题和iOS主题文本,展示出良好的应用效果。
代码实现
import jieba.posseg as psegimport codecsfrom gensim import corpora, models, similarities# 停用词定义stop_words = 'stop_words.txt'stopwords = codecs.open(stop_words, 'r', encoding='utf8').readlines()stopwords = [w.strip() for w in stopwords]# 停用词标记stop_flag = ['x', 'c', 'u', 'd', 'p', 't', 'uj', 'm', 'f', 'r']def tokenization(filename): words = pseg.cut(open(filename, 'r').read()) result = [] for word, flag in words: if flag not in stop_flag and word not in stopwords: result.append(word) return resultfilenames = [ '/Users/yiiyuanliu/Desktop/nlp/demo/articles/13 小事帮您稳血压.txt', '/Users/yiiyuanliu/Desktop/nlp/demo/articles/高血压患者宜喝低脂奶.txt', '/Users/yiiyuanliu/Desktop/nlp/demo/articles/ios.txt']corpus = [tokenization(f) for f in filenames]print(len(corpus))dictionary = corpora.Dictionary(corpus)print(dictionary)doc_vectors = [dictionary.doc2bow(text) for text in corpus]print(len(doc_vectors))# TF-IDF模型tfidf = models.TfidfModel(doc_vectors)tfidf_vectors = tfidf[doc_vectors]print(len(tfidf_vectors))print(len(tfidf_vectors[0]))query = tokenization('关于降压药的五个问题.txt')query_bow = dictionary.doc2bow(query)print(len(query_bow))index = similarities.MatrixSimilarity(tfidf_vectors)sims = index[query_bow]print(list(enumerate(sims)))# LSI模型lsi = models.LsiModel(tfidf_vectors, num_topics=2, id2word=dictionary)lsi_vector = lsi[tfidf_vectors]print([vec for vec in lsi_vector])# 查询向量转换query_lsi = lsi[query_bow]print(query_lsi)index = similarities.MatrixSimilarity(lsi_vector)sims = index[query_lsi]print(list(enumerate(sims)))
结果分析
通过实验,LSI模型在主题识别方面表现优异。查询文本在高血压主题下的向量与训练文本高度匹配,而 iOS主题文本则呈现显著差异。这种方法在特定领域文本分类中具有良好的实用价值。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月16日 21时38分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
程序员的幽默9
2023-01-23
计算机网络判断题二
2023-01-23
程序员都看不懂的代码
2023-01-23
LLM+多智能体协作:基于CrewAI与DeepSeek的邮件自动化实践
2023-01-23
404错误页面简约清新源码 非常好看
2023-01-23
404页面自动跳转源码
2023-01-23
44:数字序列中某一位的数字
2023-01-23
458. 可怜的小猪
2023-01-23
matlab cross()函数叉乘 计算过程详解
2023-01-23
46:把数字翻译成字符串(动态规划)
2023-01-23
Java中的迭代器接口和foreach循环的使用方法
2023-01-23
47:礼物的最大值(动态规划)
2023-01-23
49天精通Java,第28天,Java lambda表达式
2023-01-23
500套精美Logo样机模板可直接套用、轻松制作炫酷logo
2023-01-23
centos7上安装 mysql
2023-01-23
5小时内使用DeepSeek写出一篇优质论文的三步攻略指南
2023-01-23
60天新媒体公众号写作秘诀
2023-01-23
C#多线程编程系列(五)- 使用任务并行库
2023-01-23
ASP.NET MVC4 json序列化器
2023-01-23