sklearn计算余弦相似度

余弦相似度在计算文本相似度等问题中有着广泛的应用,scikit-learn中提供了方便的调用方法
第一种,使用cosine_similarity,传入一个变量a时,返回数组的第i行第j列表示a[i]与a[j]的余弦相似度
例:

from sklearn.metrics.pairwise import cosine_similarity
a=[[1,3,2],[2,2,1]]
cosine_similarity(a)
array([[1. , 0.89087081],
[0.89087081, 1. ]])

第二种使用pairwise_distances,注意该方法返回的是余弦距离,余弦距离= 1 - 余弦相似度,同样传入一个变量a时,返回数组的第i行第j列表示a[i]与a[j]的余弦距离
例:

from sklearn.metrics.pairwise import pairwise_distances
pairwise_distances(a,metric=“cosine”)
array([[0. , 0.10912919],
[0.10912919, 0. ]])

函数说明:

  1. cosing_similarity(array) 输入的样本为array格式,为经过词袋模型编码以后的向量化特征,用于计算两两样本之间的相关性

当我们使用词频或者TFidf构造出词袋模型,并对每一个文章内容做词统计以后,

我们如果要判断两个文章内容的相关性,这时候我们需要对数字映射后的特征做一个余弦相似度的匹配:即a.dot(b) / sqrt(a^2 + b^2)

在sklearn中使用metrics.pairwise import cosine_similarity

代码:

第一步: 对数据使用DataFrame化,并进行数组化

第二步:对数据进行分词,并去除停用词,使用’ '.join连接列表

第三步:np.vectorizer向量化函数,调用函数进行分词和停用词的去除

第四步:使用TF-idf词袋模型,对特征进行向量化数字映射

第五步:使用 from sklearn.metrics.pairwise import cosine_similarity, 对两两样本之间做相关性矩阵,使用的是余弦相似度计算公式

import pandas as pd
import numpy as np
import re
import nltk #pip install nltk

corpus = [‘The sky is blue and beautiful.’,
‘Love this blue and beautiful sky!’,
‘The quick brown fox jumps over the lazy dog.’,
‘The brown fox is quick and the blue dog is lazy!’,
‘The sky is very blue and the sky is very beautiful today’,
‘The dog is lazy but the brown fox is quick!’
]

labels = [‘weather’, ‘weather’, ‘animals’, ‘animals’, ‘weather’, ‘animals’]

第一步:构建DataFrame格式数据

corpus = np.array(corpus)
corpus_df = pd.DataFrame({‘Document’: corpus, ‘categoray’: labels})

第二步:构建函数进行分词和停用词的去除

载入英文的停用词表

stopwords = nltk.corpus.stopwords.words(‘english’)

建立词分割模型

cut_model = nltk.WordPunctTokenizer()

定义分词和停用词去除的函数

def Normalize_corpus(doc):
# 去除字符串中结尾的标点符号
doc = re.sub(r’[^a-zA-Z0-9\s]’, ‘’, string=doc)
# 是字符串变小写格式
doc = doc.lower()
# 去除字符串两边的空格
doc = doc.strip()
# 进行分词操作
tokens = cut_model.tokenize(doc)
# 使用停止用词表去除停用词
doc = [token for token in tokens if token not in stopwords]
# 将去除停用词后的字符串使用’ '连接,为了接下来的词袋模型做准备
doc = ’ '.join(doc)

return doc

第三步:向量化函数和调用函数

向量化函数,当输入一个列表时,列表里的数将被一个一个输入,最后返回也是一个个列表的输出

Normalize_corpus = np.vectorize(Normalize_corpus)

调用函数进行分词和去除停用词

corpus_norm = Normalize_corpus(corpus)

第四步:使用TfidVectorizer进行TF-idf词袋模型的构建

from sklearn.feature_extraction.text import TfidfVectorizer

Tf = TfidfVectorizer(use_idf=True)
Tf.fit(corpus_norm)
vocs = Tf.get_feature_names()
corpus_array = Tf.transform(corpus_norm).toarray()
corpus_norm_df = pd.DataFrame(corpus_array, columns=vocs)
print(corpus_norm_df.head())

from sklearn.metrics.pairwise import cosine_similarity

similarity_matrix = cosine_similarity(corpus_array)
similarity_matrix_df = pd.DataFrame(similarity_matrix)
print(similarity_matrix_df)

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中计算多个文本的余弦相似度,可以按照以下步骤进行: 首先,需要将文本转换为向量表示。可以使用词袋模型或TF-IDF(Term Frequency-Inverse Document Frequency)进行向量化。词袋模型将文本表示为每个单词的频率向量,而TF-IDF考虑了每个单词在整个文集中的重要性。 然后,对于每一对文本,计算它们的余弦相似度余弦相似度是通过计算向量之间的夹角来衡量的,值越接近1表示相似度越高,值越接近0表示相似度越低。 使用Python中的`scikit-learn`库可以方便地实现以上步骤。下面是一个示例代码: ```python from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity # 假设有三个文本 texts = ["这是第一个文本", "这是第二个文本", "这是第三个文本"] # 使用词袋模型进行向量化 count_vectorizer = CountVectorizer() count_vectors = count_vectorizer.fit_transform(texts) # 使用TF-IDF进行向量化 tfidf_vectorizer = TfidfVectorizer() tfidf_vectors = tfidf_vectorizer.fit_transform(texts) # 计算词袋模型下的余弦相似度矩阵 count_cosine_similarities = cosine_similarity(count_vectors) # 计算TF-IDF下的余弦相似度矩阵 tfidf_cosine_similarities = cosine_similarity(tfidf_vectors) # 输出词袋模型下的余弦相似度矩阵 print("词袋模型下的余弦相似度矩阵:") print(count_cosine_similarities) # 输出TF-IDF下的余弦相似度矩阵 print("TF-IDF下的余弦相似度矩阵:") print(tfidf_cosine_similarities) ``` 以上代码中,首先定义了三个文本,然后使用词袋模型和TF-IDF对文本进行向量化。接着利用`cosine_similarity`函数计算了词袋模型和TF-IDF下的余弦相似度矩阵。最后,通过打印相似度矩阵,可以得到三个文本之间的相似度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值