新聞中心
一、余弦相似度簡介
余弦相似度是一種衡量兩個(gè)向量相似性的方法。在自然語言處理、信息檢索、數(shù)據(jù)挖掘等領(lǐng)域都有廣泛應(yīng)用。

創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開發(fā),軟件開發(fā),微信小程序開發(fā),十載建站對(duì)小攪拌車等多個(gè)方面,擁有多年的網(wǎng)站制作經(jīng)驗(yàn)。
二、余弦相似度計(jì)算
余弦相似度計(jì)算公式如下:
import numpy as np
def cosine_similarity(vec1, vec2):
dot_product = np.dot(vec1, vec2)
norm = np.linalg.norm(vec1) * np.linalg.norm(vec2)
return dot_product / norm
其中,vec1和vec2都是向量,可以是list或numpy.ndarray類型??梢允褂?code>numpy.array方法將list類型轉(zhuǎn)換為numpy.ndarray類型。
三、處理文本數(shù)據(jù)
1. 數(shù)據(jù)預(yù)處理
在進(jìn)行余弦相似度計(jì)算之前,需要對(duì)文本進(jìn)行預(yù)處理。一般包括去除停用詞、分詞等操作。
import jieba
import re
def preprocess_text(text):
# 去除除中文、字母、數(shù)字以外的其他字符
pattern = re.compile('[^\u4e00-\u9fa5^a-z^A-Z^0-9]')
text = pattern.sub('', text)
# 分詞
seg_list = jieba.cut(text)
# 去除停用詞
stopwords = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
words = [word for word in seg_list if word not in stopwords]
return words
在此代碼中,我們使用了jieba庫進(jìn)行中文分詞,同時(shí)使用了re庫去除了除中文、字母、數(shù)字以外的其他字符。
我們將停用詞文本文件讀入,并在函數(shù)內(nèi)定義了一個(gè)stopwords變量存儲(chǔ)停用詞。然后使用列表推導(dǎo)式去除了停用詞。
2. 構(gòu)建文本向量
將文本轉(zhuǎn)化為向量是余弦相似度計(jì)算的基礎(chǔ)。我們可以使用詞袋模型或TF-IDF算法生成文本向量。
下面是使用詞袋模型生成文本向量的代碼:
def get_text_vector(text, words_dict):
text_vector = [0] * len(words_dict)
for word in text:
if word in words_dict:
text_vector[words_dict[word]]+= 1
return np.array(text_vector)
其中,輸入?yún)?shù)words_dict為一個(gè)詞典,用于存儲(chǔ)每一個(gè)單詞對(duì)應(yīng)的序列索引。
下面是使用TF-IDF算法生成文本向量的代碼:
from sklearn.feature_extraction.text import TfidfVectorizer
def get_tfidf_vector(text_list):
tfidf_vectorizer = TfidfVectorizer(tokenizer=lambda x: x, preprocessor=lambda x: x)
tfidf_vectorizer.fit(text_list)
tfidf_vector = tfidf_vectorizer.transform(text_list)
return tfidf_vector.toarray()
TF-IDF算法可以幫助我們區(qū)分文本中重要和不重要的單詞,并將其轉(zhuǎn)換為一個(gè)向量。這個(gè)向量表示文本中每個(gè)單詞在整個(gè)語料庫中的重要性。
四、應(yīng)用實(shí)例
現(xiàn)在,我們嘗試使用余弦相似度來進(jìn)行文本相似性匹配。
docs = ['我喜歡打籃球', '打籃球真是太好玩了', '毛澤東是中國偉大的領(lǐng)袖']
words_dict = {}
text_matrix = []
for i, doc in enumerate(docs):
words = preprocess_text(doc)
text_matrix.append(words)
for word in words:
if word not in words_dict:
words_dict[word] = len(words_dict)
doc_vectors = []
for words in text_matrix:
doc_vectors.append(get_text_vector(words, words_dict))
score_matrix = np.zeros((len(docs), len(docs)))
for i in range(len(docs)):
for j in range(len(docs)):
score = cosine_similarity(doc_vectors[i], doc_vectors[j])
score_matrix[i][j] = score
print(score_matrix)
在這個(gè)示例中,我們有三個(gè)文本,即'我喜歡打籃球'、'打籃球真是太好玩了'和'毛澤東是中國偉大的領(lǐng)袖'。首先,我們定義了一個(gè)words_dict字典,存儲(chǔ)了每一個(gè)單詞對(duì)應(yīng)的序列索引。然后,我們使用preprocess_text方法對(duì)每一個(gè)文本進(jìn)行預(yù)處理,生成一個(gè)處理后的列表。接下來,我們使用get_text_vector方法將每一篇文本表示為一個(gè)向量,并將這些向量儲(chǔ)存在doc_vectors列表中。最后,我們使用cosine_similarity方法計(jì)算每一篇文本之間的余弦相似度,并將得分維護(hù)在score_matrix矩陣中。
五、總結(jié)
余弦相似度是一種常用的文本相似性度量方法,在自然語言處理、信息檢索、數(shù)據(jù)挖掘等領(lǐng)域都有重要的應(yīng)用。在實(shí)現(xiàn)余弦相似度計(jì)算時(shí),需要進(jìn)行文本預(yù)處理、文本向量構(gòu)建和余弦相似度計(jì)算。實(shí)際應(yīng)用時(shí),可以根據(jù)需求選擇不同的文本向量構(gòu)建方法,比如詞袋模型或TF-IDF算法。
標(biāo)題名稱:創(chuàng)新互聯(lián)Python教程:Python計(jì)算余弦相似度
鏈接地址:http://fisionsoft.com.cn/article/cocidsd.html


咨詢
建站咨詢
