【相似度计算】详解文本相似度计算(介绍、公式)

  • 本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅!
  • ​个人主页:有梦想的程序星空
  • ​个人介绍:小编是人工智能领域硕士,全栈工程师,深耕Flask后端开发、数据挖掘、NLP、Android开发、自动化等领域,有较丰富的软件系统、人工智能算法服务的研究和开发经验。
  • ​如果文章对你有帮助,欢迎关注点赞收藏订阅。

相似度算法主要任务是衡量对象之间的相似程度,是信息检索、推荐系统、数据挖掘等的一个基础性计算。现有的关于相似度计算的方法,基本上都是基于向量的,也即计算两个向量之间的距离,距离越近越相似。

1、欧式距离

欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在n维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离),在二维和三维空间中的欧氏距离就是两点之间的实际距离。

欧氏距离是最常用的距离计算公式,衡量的是多维空间中各个点之间的绝对距离,当数据很稠密并且连续时,这是一种很好的计算方式。

最初用于计算欧几里得空间中两个点的距离,假设x,yn维空间的两个点,它们之间的欧几里得距离是:

d(x,y) = \sqrt {\sum {​{​{({x_i} - {y_i})}^2}} }

可以看出,当n=2时,欧几里得距离就是平面上两个点的距离。当用欧几里得距离表示相似度,一般采用以下公式进行转换:距离越小,相似度越大。

sim(x,y) = \frac{1}{​{1 + d(x,y)}}

范围在[0,1]之间,值越大,说明d(x,y)越小,也就是距离越近,则相似度越大。

欧式距离相似度算法需要保证各个维度指标在相同的刻度级别,比如对身高、体重两个单位不同的指标使用欧氏距离可能使结果失效。并且,欧氏距离适合比较稠密的矩阵。

注意:欧氏距离不适用于布尔向量之间的计算。

2、余弦相似度

余弦相似度就是通过一个向量空间中两个向量夹角的余弦值作为衡量两个个体之间差异的大小。

公式如下:

sim(i,j) = \cos (i,j) = \frac{​{i \cdot j}}{​{||i|| \cdot ||j||}}

范围:[-1,1],两向量越相似,向量夹角越小,余弦相似度越大;值为负时,两向量负相关。

余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。

相比欧氏距离,余弦距离更加注重两个向量在方向上的差异。

余弦相似度主要的应用场景有:

1)推荐系统中的协同过滤;

2)计算文本的相似性;

欧式距离和余弦相似度的区别:

余弦相似度衡量的是维度间取值方向的一致性,注重维度之间的差异,不注重数值上的差异;

而欧氏距离度量的正是数值上的差异性。

3、皮尔逊相关系数

皮尔逊相关系数一般用于计算两个定距变量间联系的紧密程度。假设有两个变量X,Y,则它们之间的相关系数为:

皮尔森相关系数是衡量线性关联性的程度,p的一个几何解释是其代表两个变量的取值根据均值集中后构成的向量之间夹角的余弦。

皮尔逊相似度计算结果在[-1,1]之间,-1表示负相关, 1表示正相关。

当相关系数为0时,X和Y两变量无关系。

当X的值增大(减小),Y值增大(减小),两个变量为正相关,反之,为负相关。

皮尔逊相似度衡量两个变量是不是同增同减,即两个变量的变化趋势是否一致。

它不适合计算布尔值向量之间的相关度,适合处理评分的数据,且是稠密的数据,稀疏数据不适合。

当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于

1)两个变量之间是线性关系,都是连续数据。

2)两个变量的总体是正态分布,或接近正态的单峰分布。

3)两个变量的观测值是成对的,每对观测值之间相互独立。

4、杰卡德相似系数

Jaccard(杰卡德)相似性系数主要用于计算符号度量或布尔值度量的样本间的相似度。

Jaccard(Jaccard similarity coefficient)相似系数等于样本集A和B交集的个数和样本集A和B并集个数的比值,在[0,1]之间,当两个样本完全一致时,结果为1,当两个样本完全不同时,结果为 0,用符号J(A,B)表示:

J(A,B) = \frac{​{|A \cap B|}}{​{|A \cup B|}}

Jaccard(杰卡德)距离:与杰卡德相似系数相反,用两个集合中不同元素所占元素的比例来衡量两个集合(样本)的区分度。

{J_\delta }(A,B) = 1 - J(A,B) = \frac{​{|A \cup B| - |A \cap B|}}{​{|A \cup B|}}

由于Jaccard相似系数主要用于计算符号度量或布尔值度量的个体间的相似度,无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。

Jaccard系数主要的应用场景有:

1)过滤相似度很高的新闻,或者网页去重;

2)考试防作弊系统;

3)论文查重系统;

如何选择相似度算法:

1)余弦相似度或者皮尔逊相关系数适合用户评分数据(实数值);

2)杰卡德相似度适用于隐式反馈数据,如:0/1、布尔值、是否收藏(点击、加购物车等);

5、常用距离公式汇总

明氏距离(Minkowski Distance)的推广:p=1为曼哈顿距离,p=2为欧氏距离,切比雪夫距离是明氏距离取极限的形式。

\begin{array}{l} MinkowskiDistance = {(\sum\limits_{i = 1}^n {|{x_i} - {y_i}{|^p}} )^{\frac{1}{p}}}\\ ManhattanDistance = \sum\limits_{i = 1}^n {|{x_i} - {y_i}|} \\ EuclideanDistance = \sqrt {\sum\limits_{i = 1}^n {​{​{({x_i} - {y_i})}^2}} } \\ ChebyshevDistance = \mathop {\lim }\limits_{p \to \infty } {(\sum\limits_{i = 1}^n {|{x_i} - {y_i}{|^p}} )^{\frac{1}{p}}} = \max |{x_i} - {y_i}| \end{array}

标准欧氏距离的思路:将各个维度的数据进行标准化:标准化后的值 = ( 标准化前的值 - 分量的均值 ) /分量的标准差,然后计算欧式距离,如下:

关注微信公众号【有梦想的程序星空】,了解软件系统和人工智能算法领域的前沿知识,让我们一起学习、一起进步吧!

  • 7
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 文本相似度分析是比较两个文本之间的相似程度,Python可以通过多种方式实现这一操作。以下是一个简单的示例。 首先,我们需要使用一个文本分析库,例如NLTK或spaCy。这些库提供了许多文本处理工具和算法。 其次,我们需要加载要比较的两个文本。可以从文件中读取文本,或者直接将文本字符串保存在变量中。 接下来,我们需要对文本进行预处理。这包括去除停用词(例如“a”、“is”、“the”等)、标点符号和特殊字符,以及将文本转换为小写。 然后,我们可以使用一种或多种相似度算法来比较两个文本之间的相似程度。常见的算法包括余弦相似度、Jaccard相似度和编辑距离。这些算法的实现通常可以在文本分析库中找到。 最后,我们可以将相似度得分输出为一个介于0和1之间的值。接近1的得分表示文本越相似,接近0的得分表示文本越不相似。 下面是一个示例代码: ```python import nltk from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.stem import WordNetLemmatizer from nltk.metrics.distance import edit_distance from sklearn.feature_extraction.text import TfidfVectorizer # 加载停用词 stop_words = set(stopwords.words("english")) # 加载文本 text1 = "This is a sample sentence." text2 = "This is another example sentence." # 预处理文本 lemmatizer = WordNetLemmatizer() tokens1 = [lemmatizer.lemmatize(word.lower()) for word in word_tokenize(text1) if word.isalpha() and word.lower() not in stop_words] tokens2 = [lemmatizer.lemmatize(word.lower()) for word in word_tokenize(text2) if word.isalpha() and word.lower() not in stop_words] # 计算文本相似度(余弦相似度) vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform([text1, text2]) similarity_score = (tfidf_matrix * tfidf_matrix.T).A[0, 1] # 计算文本相似度(编辑距离) edit_distance_score = edit_distance("".join(tokens1), "".join(tokens2)) print("余弦相似度:", similarity_score) print("编辑距离:", edit_distance_score) ``` 通过以上步骤,我们可以得到两个文本之间的相似度得分。这个示例只涵盖了最基本的文本相似度分析方法,实际上还有许多其他复杂的技术和算法可以用于更精确的分析。 ### 回答2: 文本相似度分析是指通过计算两个文本之间的相似度来衡量它们之间的相似程度。Python提供了多种库和算法可以实现这个操作,下面我会详细介绍一种常用的方法。 一、文本预处理: 在进行文本相似度分析之前,首先需要对文本进行预处理。常见的预处理方法包括去除停用词、转换为词向量表示、将文本转换为TF-IDF向量等。 二、计算文本相似度: 一种常用的计算文本相似度的方法是通过计算两个文本的余弦相似度来衡量它们之间的相似程度。步骤如下: 1. 将两个文本转换为词向量表示,可以使用词袋模型或TF-IDF向量表示。 2. 计算两个向量的余弦相似度。余弦相似度值越接近于1,表示两个向量越相似;值越接近于0,表示两个向量越不相似。 三、代码示例: 下面是一个简单的示例代码,用于计算两个文本之间的相似度。 ```python import numpy as np from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity # 定义两个文本 text1 = "Python是一种简单易学的编程语言" text2 = "Python是一种功能强大的编程语言" # 创建词袋模型 vectorizer = CountVectorizer().fit_transform([text1, text2]) # 计算余弦相似度 similarity = cosine_similarity(vectorizer[0], vectorizer[1]) print("文本相似度:", similarity[0][0]) ``` 以上代码中,我们使用了CountVectorizer来创建词袋模型,并计算了两个文本之间的余弦相似度。 通过上述步骤,我们就可以使用Python实现简单的文本相似度分析操作了。当然,还有其他更复杂的方法和算法可以用于文本相似度分析,如基于词向量的方法(如Word2Vec、GloVe)和基于深度学习的方法(如BERT、ELMo),可以根据具体需求选择合适的方法进行分析。 ### 回答3: 文本相似度分析是通过比较文本之间的相似性来确定它们之间的相关性。Python提供了强大的工具和库来实现这样的操作。 首先,我们需要使用自然语言处理工具对文本进行预处理,例如去除标点符号、停用词和数字等。常用的预处理库包括NLTK和spaCy。 在预处理完成后,我们可以使用不同的文本相似度度量方法来比较文本之间的相似度。其中常见的方法包括余弦相似度、欧几里得距离和Jaccard相似度等。 对于余弦相似度,我们可以使用Python中的scikit-learn库来计算。首先,我们需要将文本转换为向量表示,常用的方法是使用词袋模型或TF-IDF模型。然后,我们可以使用cosine_similarity函数来计算两个向量之间的余弦相似度。 对于欧几里得距离和Jaccard相似度,我们可以使用Python中的scipy库来计算。欧几里得距离可以使用euclidean函数,而Jaccard相似度可以使用jaccard_similarity函数来计算。 除了以上方法,还可以使用更高级的文本相似度计算方法,例如Word2Vec或BERT模型。这些模型基于神经网络,能够更好地捕捉文本之间的语义关系。 综上所述,Python提供了丰富的库和工具来实现简单的文本相似度分析操作。我们只需要进行预处理,选择适当的相似度度量方法,并使用相应的库函数来计算即可。这些操作可以帮助我们在信息检索、推荐系统和文本分类等领域中处理和分析大量的文本数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序遇上智能星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值