余弦相似度
余弦相似度是一种在多维空间中衡量两个非零向量之间角度的度量,它被广泛应用于文本分析、信息检索、推荐系统等领域。在文本处理中,它可以帮助我们理解两个文档或句子在语义上的接近程度。在这个C++程序中,我们将探讨如何实现这个概念并计算给定示例中的文本相似度。 我们要理解余弦相似度的基本原理。假设我们有两个向量A和B,它们代表了两个文本的词频向量,即每个维度对应一个词,值表示该词在文本中出现的频率。余弦相似度是通过计算这两个向量的夹角余弦值来衡量它们的相似性。余弦值范围在-1到1之间,1表示完全相同,-1表示完全不同,0表示两个向量正交,即它们在概念上不相关。 在C++中实现余弦相似度,首先需要对输入的文本进行预处理,包括分词、去除停用词(如“我”,“不”等常见无实际含义的词)以及构建词频矩阵。由于给定的描述中提到没有分词程序,我们需要手动用空格进行分词。例如,对于句子“我 爱 看 电视”和“我 不 爱 看 电影”,我们可以直接将其视为分词结果。 接下来,我们需要创建一个函数来计算词频向量。可以遍历每个单词,记录每个词在两个文本中出现的次数,然后将这些数据存储在一个二维数组或哈希表中。对于上述示例,我们可以得到两个向量: 向量A: [1, 1, 1, 1] 向量B: [1, -1, 1, 0] 其中,向量A的四个元素分别对应“我”,“爱”,“看”,“电视”,向量B则对应“我”,“不”,“爱”,“看”。 余弦相似度的计算公式为: 余弦相似度 = (A·B) / (||A|| * ||B||) 其中,A·B是A和B的点乘,||A||和||B||分别是A和B的模(即向量的欧几里得长度)。在C++中,可以使用以下步骤实现: 1. 计算点乘:遍历词频向量,对每个维度上的值相乘求和。 2. 计算模:分别计算两个向量的模,模等于向量元素的平方和开根号。 3. 计算余弦相似度:将点乘结果除以两向量模的乘积。 在上述例子中,A·B = (1*1) + (1*(-1)) + (1*1) + (1*0) = 1,||A|| = sqrt(1^2 + 1^2 + 1^2 + 1^2) = sqrt(4),||B|| = sqrt(1^2 + (-1)^2 + 1^2 + 0^2) = sqrt(3)。因此,余弦相似度 = 1 / (sqrt(4) * sqrt(3)) ≈ 0.4714,这表明两个句子在语义上有一定的相似性,但不是非常接近。 在实际应用中,为了提高效率和准确性,通常会使用TF-IDF(词频-逆文档频率)或其他权重函数对词频进行调整,并且可能需要使用更复杂的分词工具来处理中文文本。此外,对于大规模数据集,可以使用数据结构如倒排索引来加速计算过程。 这个C++程序展示了如何在没有外部库的情况下实现基本的余弦相似度计算。然而,在实际开发中,我们通常会利用像jieba分词库和开源的相似度计算库,如Annoy或Faiss,来处理中文文本并提升计算性能。