python 拼音相似度_用Python进行简单的文本相似度分析

学习目标:

1.利用gensim包分析文档相似度

2.使用jieba进行中文分词

3.了解TF-IDF模型

环境:

Python 3.6.0 |Anaconda 4.3.1 (64-bit)

工具:

jupyter notebook

注: 为了简化问题,本文没有剔除停用词"stop-word".实际应用中应该剔除停用词.

首先引入分词API库jieba、文本相似度库gensim

import jieba

from gensim import corpora, models, similarities

以下doc0-doc7是jige几个最简单的文档,我们可以称之为目标文档,本文就是分析doc_test(测试文档)与以上8个文档的相似度.

doc0 = "我不喜欢上海"

doc1 = "上海是一个好地方"

doc2 = "北京是一个好地方"

doc3 = "上海好吃的在哪里"

doc4 = "上海好玩的在哪里"

doc5 = "上海是好地方"

doc6 = "上海路和上海人"

doc7 = "喜欢小吃"

doc_test="我喜欢上海的小吃"

分词:

首先, 为了简化操作, 把目标文档放到一个列表all_doc中.

all_doc = []

all_doc.append(doc0)

all_doc.append(doc1)

all_doc.append(doc2)

all_doc.append(doc3)

all_doc.append(doc4)

all_doc.append(doc5)

all_doc.append(doc6)

all_doc.append(doc7)

以下对目标文档进行分词, 并且保存在列表all_doc_list中

all_doc_list = []

for doc in all_doc:

doc_list = [word for word in jieba.cut(doc)]

all_doc_list.append(doc_list)

把分词后形成的列表显示出来:

print(all_doc_list)

[[‘我’, ‘不’, ‘喜欢’, ‘上海’],

[‘上海’, ‘是’, ‘一个’, ‘好’, ‘地方’],

[‘北京’, ‘是’, ‘一个’, ‘好’, ‘地方’],

[‘上海’, ‘好吃’, ‘的’, ‘在’, ‘哪里’],

[‘上海’, ‘好玩’, ‘的’, ‘在’, ‘哪里’],

[‘上海’, ‘是’, ‘好’, ‘地方’],

[‘上海’, ‘路’, ‘和’, ‘上海’, ‘人’],

[‘喜欢’, ‘小吃’]]

以下把测试文档也进行分词, 并保存在列表doc_test_list中

doc_test_list = [word for word in jieba.cut(doc_test)]

print(doc_test_listt)

[‘我’, ‘喜欢’, ‘上海’, ‘的’, ‘小吃’]

制作语料库:

首先用dictionary方法获取词袋(bag-of-words)

dictonary = corpora.Dictionary(all_doc_list)

词袋中用数字对所有词进行了编导

dictionary.keys()

编号与词之间的对应关系

dictionary.token2id

{‘一个’: 4,

‘上海’: 0,

‘不’: 1,

‘人’: 14,

‘北京’: 8,

‘和’: 15,

‘哪里’: 9,

‘喜欢’: 2,

‘在’: 10,

‘地方’: 5,

‘好’: 6,

‘好吃’: 11,

‘好玩’: 13,

‘小吃’: 17,

‘我’: 3,

‘是’: 7,

‘的’: 12,

‘路’: 16}

以下使用doc2bow制作语料库

corpus = [dictionary.doc2bow(doc) for doc in all_doc_list]

语料库如下,语料库是一组向量,向量中的元素是一个二元组(编号,频次数), 对应分词后的文档中的每一个词.

[[(0, 1), (1, 1), (2, 1), (3, 1)],

[(0, 1), (4, 1), (5, 1), (6, 1), (7, 1)],

[(4, 1), (5, 1), (6, 1), (7, 1), (8, 1)],

[(0, 1), (9, 1), (10, 1), (11, 1), (12, 1)],

[(0, 1), (9, 1), (10, 1), (12, 1), (13, 1)],

[(0, 1), (5, 1), (6, 1), (7, 1)],

[(0, 2), (14, 1), (15, 1), (16, 1)],

[(2, 1), (17, 1)]]

以下用同样的方法, 把测试文档也转换为二元组的向量。

doc_test_vec =dictionary.doc2bow(doc_test_list)

doc_test_vec

[(0, 1), (2, 1), (3, 1), (12, 1), (17, 1)]

相似度分析

使用TF-IDF模型对语料库建模

tfidf = models.TfidfModel(corpus)

获取测试文档中, 每个词的TF-IDF

tfidf[doc_test_vec]

[(0, 0.08112725037593049),

(2, 0.3909393754390612),

(3, 0.5864090631585919),

(12, 0.3909393754390612),

(17, 0.5864090631585919)]

对每个目标文档, 分析测试文档的相似度

index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary.keys()))

sim = index[tfidf[doc_test_vec]]

sim

array([ 0.54680777, 0.01055349, 0. , 0.17724207, 0.17724207,

0.01354522, 0.01279765, 0.70477605], dtype=float32)

根据相似度排序

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

[(7, 0.70477605),

(0, 0.54680777),

(3, 0.17724207),

(4, 0.17724207),

(5, 0.013545224),

(6, 0.01279765),

(1, 0.010553493),

(2, 0.0)]

从分析结果来看, 测试文档与doc7相似度最高,其次是doc0, 与doc2的相似度为零. 之后可以根据TF-IDF的原理,看看是否符合预期.

最后总结一下文本相似度分析的步骤:

1.读取文档

2.对要计算的多篇文档进行分词

3.对文档进行整理成指定格式,方便后续进行计算

4.计算出词语的词频

5.[可选]对词频低的词语进行过滤

6.建立语料库词典

7.加载要对比的文档

8.将要对比的文档通过doc2bow转化为词袋模型

9.对词袋模型进行进一步处理,得到新语料库

10.将新语料库通过tfidfmodel进行处理, 得到tfidf

11.通过token2id得到特征数12、稀疏矩阵相似度, 从而建立索引13、得到最终相似结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中有多种方法可以实现简单文本相似度分析操作,下面将详细介绍一种常用的方法。 一、准备工作: 1. 导入必要的库:从sklearn中导入CountVectorizer和cosine_similarity。 2. 定义文本列表:将要比较的文本存储在一个列表中。 二、数据预处理: 1. 实例化CountVectorizer:使用CountVectorizer将文本转换为词频矩阵,每个文本中的每个词都是一个特征。 2. 计算词频矩阵:调用fit_transform方法将文本列表作为参数传递给CountVectorizer实例,得到词频矩阵。 三、相似度分析: 1. 计算余弦相似度矩阵:将词频矩阵作为参数传递给cosine_similarity函数,得到文本之间的余弦相似度矩阵。 四、结果解释: 1. 解释余弦相似度矩阵:余弦相似度矩阵是一个对称矩阵,对角线上的元素都是1,表示文本与自身的相似度为最大值1;非对角线上的元素表示两个不同文本之间的相似度,值越大表示相似度越高。 示例代码如下: ```python from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity # 定义文本列表 texts = ['这是一个文本。', '这是另一个文本。', '这是一个不同的文本。'] # 实例化CountVectorizer并计算词频矩阵 vectorizer = CountVectorizer() word_count_matrix = vectorizer.fit_transform(texts) # 计算余弦相似度矩阵 cosine_sim_matrix = cosine_similarity(word_count_matrix, word_count_matrix) # 解释余弦相似度矩阵 for i in range(len(texts)): for j in range(len(texts)): print(f"文本{i+1}与文本{j+1}的相似度为:{cosine_sim_matrix[i][j]}") ``` 这个示例中,我们使用CountVectorizer将文本转换为词频矩阵,然后使用cosine_similarity计算余弦相似度矩阵。最后,我们打印出每个文本与其他文本相似度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值