一、简介
在NLP和数据挖掘领域,文本分析是一个非常重要的领域,它帮助我们让计算机理解语言的作用和用途。 文本分析也是数据挖掘的重要手段。 通过文本分析,我们可以快速阅读一本书、一篇文章或一个段落中的关键词和核心思想,而文本相似度就是我们用来消除无用信息的工具。 或重复信息的重要手段。 让计算机找出文本中的差异。
当我们比较事物时,我们经常会使用“不同”、“相同”、“相似”等词语,这些词语的背后都牵涉到一个动作——双方的比较。 只有通过比较才能得出相同或不同的结论。 但万物之间真的有如此极端的区别吗? 在我看来,不,用生活中的“相似”二字来形容可能更准确。 比如男人和女人,虽然他们的生理器官和可能的思想有些不同,但他们也有相同的东西,那就是他们都是人,这意味着相似度不为0; 例如,石头和草,它们都是虚拟类的实体类,相似度不为0; 两个句子中的单词和词序一致,相似度为1。一个概念可以应用于同一事物的两种不同定义。 非常方便。
生活中,“文本相似度”应用于信息检索、文档副本检测等领域。 有些人可能认为文字就是文字,但事实不一定如此。 文本相似度有着更广泛的应用。 除了文本匹配之外,还可以是图片、音频等,因为它们本质上以二进制形式存在于计算机中。
相似度的本质是计算个体之间的相似程度。 什么是个人? 对于句子来说,个体就是句子; 对于图片来说3D角色,个体就是图片。
我们常用的分析相似度的方法通常可以用来分析其他数据,计算其他信息相似度的方法一般也可以用来分析文本相似度。
那么接下来我就从最简单最常用的方法余弦相似度开始,介绍一下我所学的两种基于距离计算的字面相似度方法,然后介绍一下我不太明白的语义相似度计算方法。 并附上代码和我个人的理解。
2. 余弦相似度 2.1 余弦相似度的定义
余弦相似度通过向量空间中两个向量之间夹角的余弦值来衡量两个个体之间的差异。 设置1为相同,0为不同,那么相似度值在01之间,所有事物的相似度范围都应该是01。如果不是0~1,那就不是我们应该研究的东西。 这是神经科学家和生物学家的问题。 余弦相似度的特点是余弦值接近1,角度趋于0,说明两个向量更加相似。 看下面的图片,
三角形越平坦,两个个体之间的距离越小,相似度越大; 反之,相似度越小。 然而,文本的相似度计算只是针对字面量进行计算,也就是说,只根据句子的字符是否相同,而不考虑其语义。 那是另一个研究方向。 例如句子1:你真漂亮:。 第2句话:你太丑了。 这两个句子有75%相似,但语义却完全不同。 他们可以说是完全相反的。 另一个例子,第 1 句:It's好吃。 第2句:非常好吃。 两个句子的相似度为0,但在一定场景下语义是一致的。
所以在实践中,并没有完美的解决方案。 每个公司都会根据业务需求调整相似度算法,使其在某些场合能够准确计算。
这种方法类似于编辑距离计算,通过计算将其转化为针对特定句子的最少编辑操作次数。 如果它们之间的距离越大,则意味着它们的差异越大。 允许的编辑操作包括用另一个字符替换另一个字符、插入一个字符和删除一个字符,但是当单词含义超过句子结构时,就会出现与上述类似的问题。
2.2 计算相似度的步骤
通过计算模型公式就可以清楚地得到余弦相似度的值。 所以我们要写一个程序来实现这个算法,我们需要将两个个体转化为向量,然后用这个公式求出最终的解。
例如,向量a(x1,x2,x3,x4,x5),向量b(y1,y2,y3,y4,y5)。 分子为 (x1y1) +(x2y2) + (x3y3) +(x4y4)+(x5y5),分母为 sqrt(x1x1+x2x2+x3x3+x4x4+x5x5)。
那么计算两个句子的相似度的步骤如下:
1.通过中文分词,根据分词算法将完整的句子划分为独立的词集。
2. 求两个词集的并集(词袋)
3、计算每个词集的词频,并对词频进行向量化
4.引入向量计算模型可以计算文本相似度
2.3 示例
2.4 改进方法
计算步骤中有一个关键词——词频TF。 词频是指某个词在文章或句子中出现的次数。 如果一个词非常重要,它显然应该在一篇文章中出现多次,但这并不是绝对的。 比如“地”、“的”、“啊”等词语,它们出现的次数对文章的质量有很大的影响。 中心思想根本没有帮助,它只是汉语语法结构的一部分。 此类词也称为“停用词”。 因此,在计算文章的词频时,应该过滤掉停用词。
但是我们可以通过过滤掉停用词来更接近问题吗? 不必要。 例如,如果要分析近期的十九届中央纪委二中全会等新闻文章,显然每篇文章中都会出现“中国”一词。 ,但是对于每条新闻的主旨有帮助吗? 与“反腐”、“人工智能”、“大数据”等词语相比,“中国”一词在文章中应该是次要的。
因此,进一步假设,如果某个词比较少见(在我们准备的文章库中占的比例比较小),但是在这篇文章中出现了很多次,那么它很可能体现了这篇文章的特点,这正是我们需要的关键字。
这里,在词频TF的基础上,引入了逆文档频率IDF的概念。这就是下面要介绍的TF-IDE计算的方法,不仅考虑词频,还给每个词分配一个权重反映某个词的重要性。
2.5 代码
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
from scipy.linalg import norm
def tf_similarity(s1, s2):
def add_space(s):
return ' '.join(list(s))
s1, s2 = add_space(s1), add_space(s2) #在字中间加上空格
cv = CountVectorizer(tokenizer=lambda s: s.split()) #转化为TF矩阵
corpus = [s1, s2]
vectors = cv.fit_transform(corpus).toarray() #计算TF系数
return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))
s1 = '你在干嘛呢'
s2 = '你在干什么呢'
print(tf_similarity(s1, s2))
输出
这里的0.73代表两个句子之间的向量余弦相似度。
3. TF-IDF计算
一般来说,在一篇文章或一个句子中,每个词都有不同的重要性,这就是词的权重。 在词频的基础上,给每个词赋予一个权重,进一步体现该词的重要性。
3.1 TF、IDE、TF-IDF 的计算方法 3.1.1 词频 TF 的计算方法
词频归一化的目的是分析同一维度上的所有词频。 词频标准化有两个标准。 第一种情况3D道具,词汇量小,不方便分析。 一般来说,第二个标准更适用,因为它可以使词频的值相对较大,使分析更容易。 例如,一个单词在一本书中出现了100次,但整本书有10万个单词,但词频在一个句子中出现了5次。
3.1.2 逆文档频率IDF的计算方法
在这个公式中,有一些地方需要解释一下:
为什么+1? 是为了处理分母为0的情况,如果所有的文章都不包含这个词,那么分子就是
是0,所以+1是为了防止分母为0。为什么要用log函数呢? log函数是单调递增的,计算log进行归一化,保证逆文档频率不会太大。 会有负数吗? 绝对不行,分子必须大于分母。 3.1.3 TF-IDF的计算方法
从公式可以知道,TF-IDF与其在文档中出现的次数成正比,与包含该词的文档数量成反比。
3.2 使用TF-IDF计算文章相似度。 使用TF-IDF算法查找两篇文章的关键词。 从每篇文章中取出几个关键词(比如20个),合并成一个集合,计算每篇文章对这个集合的贡献度。 文章中单词的词频(为了避免文章长度的差异,可以使用相对词频)生成两篇文章的词频向量,计算两个向量的余弦相似度。 值越大,越相似。 3.3 代码
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
from scipy.linalg import norm
def tfidf_similarity(s1, s2):
def add_space(s):
return ' '.join(list(s))
# 将字中间加入空格
s1, s2 = add_space(s1), add_space(s2)
# 转化为TF矩阵
cv = TfidfVectorizer(tokenizer=lambda s: s.split())
corpus = [s1, s2]
vectors = cv.fit_transform(corpus).toarray()
# 计算TF系数
return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))
s1 = '你在干嘛呢'
s2 = '你在干什么呢'
print(tfidf_similarity(s1, s2))
输出
这里的0.58代表两个句子之间的TF-IDF值。 无论从原理、计算过程还是代码实现上,我们都可以发现余弦相似度是计算欧氏距离最基本的算法,但它是本文中的词频处理,即TF方法,它源自于优化本章中的TF-IDF方法。
4. 基于语义相似度的计算----DSSM 4.1 原理
DSSM(深层结构化语义模型)的原理非常简单。 通过搜索引擎中Query和Title的海量点击曝光日志,利用DNN将Query和Title表达为低维语义向量,并使用余弦距离计算两个语义向量之间的距离。 距离,最后训练语义相似度模型。 该模型不仅可以预测两个句子的语义相似度,还可以得到句子的低维语义向量表达。
目前DSSM主要用于查询和搜索问题。
DSSM自上而下具有三层结构:输入层、表示层和匹配层。
4.2 输入层
输入层的作用是将句子映射到向量空间并输入到DNN中。 这里的处理方法英文和中文有很大不同。
4.2.1 英语
英语的输入层处理方法是通过单词哈希。 例如,假设使用letter-trigams进行单词分词(3个字母为一组,#代表开头和结尾字符),则单词boy将被分词为#-bo,boy,oy-#
这样做有两个好处:第一,压缩了空间。 通过字母三元组可以将500,000个单词的one-hot向量空间压缩为30,000维向量空间。 二是增强概括能力。 三字母表达式通常可以表示英语中的前缀和后缀,而前缀和后缀往往具有通用含义。
这里之所以采用3个字母的切分粒度,是综合考虑向量空间和单词冲突。
4.2.2 中文
以50万个单词的词典为例,2字母切分粒度的单词冲突为1192个(冲突定义:至少两个单词具有相同的字母二元向量),而3字母的单词冲突减少到1192。22的效果很好,变换后的3万维向量空间并不是很大,所以综合考虑我们选择3个字母的分割粒度。
4.3 表示层
DSSM的表示层采用BOW(Bag of Words)方法,相当于丢弃了词向量的位置信息。 整个句子中的单词都放在一个袋子里,没有特定的顺序。 当然,这样做会出现问题。 让我们首先为 CNN-DSSM 和 LSTM-DSSM 奠定基础。
接下来是具有多个隐藏层的DNN,如下图所示:
设Wi表示第i层的权重矩阵,bi表示第i层的偏置项。 那么第一个隐藏层向量l1(300维)、第i个隐藏层向量li(300维)和输出向量y(128维)可以表示为:
使用tanh作为隐藏层和输出层的激活函数:
最后输出128维的低维语义向量。
4.4 匹配层
Query 和 Doc 之间的语义相似度可以通过这两个语义向量(128 维)的余弦距离来表示:
Query和正样本Doc之间的语义相似度可以通过softmax函数转化为后验概率:
其中,r为softmax的平滑因子,D为Query下的正样本unity c# 查询列表 字符串相似度排序,D-为Query下的负样本(取随机负采样),D为Query下的整个样本空间。
在训练阶段unity c# 查询列表 字符串相似度排序,通过最大似然估计,我们最小化损失函数
残差将在表示层的DNN中反向传播,最终模型通过随机梯度下降(SGD)收敛以获得每个网络层的参数{Wi,bi}。
4.5 优点和缺点
优点:DSSM使用词向量作为输入,不仅可以减少对分词的依赖,还可以提高模型的泛化能力,因为每个汉字表达的语义都可以被复用。 另一方面,传统的输入层使用Embedding(如Word2Vec的词向量)或主题模型(如LDA的主题向量)直接映射单词,然后累加或拼接每个单词的向量。 由于Word2Vec和LDA都是无监督训练,这会给整个模型引入误差。 DSSM采用统一监督训练,中间过程不需要无监督模型映射,所以准确率会比较高。
缺点:如上所述,DSSM使用词袋模型(BOW),因此丢失了词序信息和上下文信息。 另一方面,DSSM采用弱监督、端到端模型,预测结果不可控。
文章来源:https://blog.csdn.net/weixin_42572826/article/details/107107659