要输出最大的五个文档,还有他们的余弦相似度
时间: 2024-02-15 16:05:58 浏览: 21
好的,我们可以稍微修改一下之前的代码,返回前五个文档及其对应的余弦相似度。
```python
import numpy as np
def cosine_similarity(query, docs):
# 将查询向量表示为一个词袋模型向量
q = np.zeros(len(vocab))
for w in query:
if w in vocab:
q[vocab[w]] += 1
# 将所有文档表示为一个词袋模型矩阵
A = np.zeros((len(docs), len(vocab)))
for i, doc in enumerate(docs):
for w in doc:
if w in vocab:
A[i, vocab[w]] += 1
# 计算余弦相似度
norm_q = np.linalg.norm(q)
norm_A = np.linalg.norm(A, axis=1)
similarity = np.dot(A, q) / (norm_q * norm_A)
# 取出前五个文档及其对应的余弦相似度
top_docs = np.argsort(-similarity)[:5]
top_similarity = similarity[top_docs]
return top_docs, top_similarity
# 读取文档
docs = []
with open('tweet.txt', 'r', encoding='utf-8') as f:
for line in f:
docs.append(line.strip().split())
# 建立词汇表
vocab = {}
for doc in docs:
for w in doc:
if w not in vocab:
vocab[w] = len(vocab)
# 计算余弦相似度并返回前五个文档及其对应的余弦相似度
query_str = 'your query string'
query = query_str.strip().split()
top_docs, top_similarity = cosine_similarity(query, docs)
for i, sim in zip(top_docs, top_similarity):
print('doc:', docs[i], 'similarity:', sim)
```
上述代码中,我们在 `cosine_similarity` 函数中添加了返回余弦相似度的代码,然后在主函数中输出前五个文档及其对应的余弦相似度。
需要注意的是,余弦相似度的取值范围是 $[-1, 1]$,如果取值越接近 $1$,表示两个向量越相似;如果取值越接近 $-1$,表示两个向量越不相似。