在没有外部库的情况下,如何计算两个句子之间的余弦相似度?

DDD
发布: 2024-11-01 13:14:02
原创
753 人浏览过

How Can You Calculate Cosine Similarity Between Two Sentences Without External Libraries?

在没有外部库的情况下计算两个句子字符串之间的余弦相似度

在自然语言处理的背景下,计算余弦相似度对于测量文档之间的文本相似度至关重要。虽然 tf-idf-cosine 等外部库可以促进此任务,但也可以在不依赖此类依赖项的情况下手动计算余弦相似度。

余弦相似度概述

余弦相似性量化了表示文本的两个向量之间的角度。余弦相似度越高,角度越小,意味着文本之间的相似度越大。它是使用归一化向量除以其幅值的点积来计算的。

手动实现余弦相似度

要手动计算余弦相似度,我们定义以下步骤:

  1. 标记化:将句子分割成单独的单词。
  2. 向量化:为每个句子中的每个单词创建一个计数器,它代表它的频率(术语频率)。
  3. 归一化:通过将每个元素除以其元素平方和的平方根(L2 范数)来归一化向量。
  4. 余弦计算:计算归一化向量的点积并除以它们的大小。

代码实现

下面是手动余弦相似度计算的 Python 实现:

<code class="python">import math
import re
from collections import Counter

WORD = re.compile(r"\w+")

def get_cosine(vec1, vec2):
    intersection = set(vec1.keys()) & set(vec2.keys())
    numerator = sum([vec1[x] * vec2[x] for x in intersection])
    
    sum1 = sum([vec1[x] ** 2 for x in vec1])
    sum2 = sum([vec2[x] ** 2 for x in vec2])
    denominator = math.sqrt(sum1) * math.sqrt(sum2)
    
    if not denominator:
        return 0.0
    else:
        return numerator / denominator

def text_to_vector(text):
    words = WORD.findall(text)
    return Counter(words)

text1 = "This is a foo bar sentence ."
text2 = "This sentence is similar to a foo bar sentence ."

vector1 = text_to_vector(text1)
vector2 = text_to_vector(text2)

cosine = get_cosine(vector1, vector2)

print("Cosine:", cosine)</code>
登录后复制

结果

此代码执行如下:

Cosine: 0.861640436855
登录后复制

此值表示两个句子之间的高余弦相似度,确认它们在文本上相似。

进一步的考虑因素

虽然此手动方法提供了基本的实现,但可以通过以下方式增强: :

  • 结合词干或词形还原以改进单词规范化。
  • 实现更复杂的标记化方案。
  • 添加 TF-IDF 等权重以实现更准确的相似性计算。

以上是在没有外部库的情况下,如何计算两个句子之间的余弦相似度?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!