‘壹’ 基于谷歌距离的语义相似度为多少时可确定两者为同义词
词语的语义相似度计算主要有两种方法 :
一类是通过语义词典,把有关词语的概念组织在一个树形的结构中来计算;
另一类主要是通过词语上下文的信息,运用统计的方法进行求解。
1. 语义相似度
Dekang Lin认为任何两个词语的相似度取决于它们的共性(Commonality)和个性(Differences),然后从信息论的角度给出了定义公式:
其中,分子表示描述A,B共性所需要的信息量;分母表示完整地描述A,B所需要的信息量。
其中,Sl,S2表示两个义原,S表示离它们最近的共同祖先,p(s)是该结点的子结点个数(包括自己)与树中的所有结点个数的比值。
刘群、李素建以基于实例的机器翻译为背景,认为语义相似度就是两个词语在不同的上下文中可以互相替换使用而不改变文本的句法语义结构的程度。两个词语,如果在不同的上下文中可以互相替换且不改变文本的句法语义结构的可能性越大,二者的相似度就越高,否则相似度就越低。
对于两个词语W1,W2,如果记其相似度为Sim(W1,W2) ,其词语距离为Dis(W1,W2),根据刘群、李素建的公式:
其中a是一个可调节的参数。n的含义是:当相似度为0.5时的词语距离值。
词语距离和词语相似度是一对词语的相同关系特征的不同表现形式,如果两个概念之间的语义距离越近,就认为它们越相似,因此二者之问可以给出一个简单对应关系:
其中,Dis(Wl,W2)为树中W1,W2所代表的结点在树中的距离,k为比例系数。
一般地说,相似度一般被定义为一个0到1之间的实数。特别地,当两个词语完全一样时,它们的相似度为1;当两个词语是完全不同的概念时,它们的相似度接近于0
2. 语义相似度的计算方法
词语距离有两类常见的计算方法,一种是根据某种世界知识(Ontology)或分类体系(Taxonomy)来计算,一种利用大规模的语料库进行统计。
2.1 根据分类体系计算词语语义距离的方法
该方法又称基于树的语义相似度研究方法,基于树的语义相似度计算的算法大体上分为两种:一是基于距离的语义相似性测度;二是基于信息内容的语义相似性测度。一般是利用一部语义词典(如Wordnet,Hownet),语义词典都是将所有的词组织在一棵或几棵树状的层次结构中。在一棵树状图中,任何两个结点之间有且只有一条路径。于是,这条路径的长度就可以作为这两个词语概念间语义距离的一种度量;而且随着概念所处结点越深,其所包含的语义信息越丰富,越能准确地决定概念的性质,它们对语义相似度起着决定作用。
2.1.1 基于树状层次计算语义相似度的基本思想
例如,在图1(取自Wordnet本体中的一小部分)中,boy和girl之间的最短路径是boy—male—person—female—girl,最小路径长度为4。而teacher和boy之间的最小路径长度为6。因此,girl比teacher在语义上更接近于boy。该测度算法在基于Wordnet的语义网中获得了较好的计算结果。
2.1.2 基于《知网Hownet》的语义相似度计算
由于《知网Hownet》中词语不是组织在一个树状的层次体系中,而是一种网状结构;同时借助义原和符号对概念进行描述。对于两个汉语词语Wl和W2,如果W1有个n义项(概念):Sll,S12,…,S1n,W2有个m义项(概念):S21,S22,…,S2m,刘群、李素建认为W1和W2的相似度是各个概念的相似度之最大值,也就是说:
为了更加精确地计算出词语的语义相似度,在《知网》中对一个实词的描述可以表示为一个特征结构,该特征结构含有以下四个特征:
*第一基本义原描述:其值为一个基本义原,将两个概念的这一部分的相似度记为Siml(Sl,S2);
*其它基本义原描述:对应于语义表达式中除第一基本义原描述式以外的所有基本义原描述式,其值为一个基本义原的集合,将两个概念的这一部分的相似度记为Sim2(S1,S2);
*关系义原描述:对应于语义表达式中所有的关系义原描述式,其值是一个特征结构,对于该特征结构的每一个特征,其属性是一个关系义原,其值是一个基本义原,或一个具体词。将两个概念的这一部分的相似度记为Sim3(S1,S2);
*关系符号描述:对应于语义表达式中所有的关系符号描述式,其值也是一个特征结构,对于该特征结构的每一个特征,其属性是一个关系义原,其值是一个集合,该集合的元素是一个基本义原,或一个具体词。将两个概念的这一部分的相似度记为Sim4(S1,S2)。
通过以上分析,可知在实际的《知网》结构中,由于各个义原所处的层次不一样,因而它们对词语相似度的影响程度也不一样,也就是说部分相似性在整体相似性中所占的权重是不一样的,权重(百分比)用β表示,于是,在知网中,概念的整体相似度可以记为:
其中,β(1≤i≤4)是可调节的参数,且有:β1+β2+β3+β4=1,β1≥β2≥P3≥β4。后者反映了Siml(Sl,S2)到Sim4(Sl,S2)对于总体相似度所起到的作用依次递减。由于第一独立义原描述式反映了一个概念最主要的特征,所以应该将其权值定义得比较大,一般应在0.5以上。在以上计算中,最后求加权平均时,各部分取相等的权值。这样,就把两个词语之间的相似度问题归结到了两个概念之间的相似度问题。
2.2 利用大规模的语料库进行统计
基于语料库的词语相似度研究大都采用了上下文语境的统计描述方法,即认同这样一个论断:词语的上下文可以为词语定义提供足够信息。词语向量空间模型是目前基于统计的词语相似度计算策略使用比较广泛的一种,算法复杂度也能够实现的模型。该模型事先选择一组特征词,然后计算这一组特征词与每一个词的相关性(一般用这组词在实际的大规模语料中以该词在上下文中出现的频率来度量),于是对于每一个词都可以得到一个相关性的特征词向量,然后利用这些向量之间的相似度作为这两个词的相似度。
由计算机自然语言处理专家RudiL.Cilibrasi和Paul M.B.Vitanyi[2007.12]提出的语义相似度计算方法,该方法理论基础涉及信息论、压缩原理、柯尔莫哥洛夫复杂性、语义WEB、语义学等,基本思想是把Intemet作为一个大型的语料库,以Google(对其它的搜索引擎如网络同样适用)作为搜索引擎,搜索返回的结果数作为计算的数值依据,其计算公式如下:
其中,NGD(Normalized Google Distance,介于0与1之间)表示标准谷歌距离(以此衡量语义相似性大小),f(x),f(y)分别表示含概念x,y的网页数,f(x,y)表示同时含有概念的网页数,N表示Google引用的互联网上的网页总数。
可以以一次实验来说明,假设用Google搜索词语'horse'返回46700000(记为f(x))条结果,搜索词语'rider'返回结果数为12200ooo(记为f(y)),搜索同时含'horse,rider'的网页数是2630ooo(记为f(x,y)),Google共引用的网页数是N=8058044651,代入上述公式求得:
NGD(horse,rider)≈0.443
3. 两类主要语义相似度计算方法的比较
‘贰’ else算法是什么意思
Else算法是一种用于解决二分查找、二叉树搜索等问题的算法。跟其他算法不同的是,Else算法的核心在于对于不符合特定条件的情况进行处理。它的特点在于,当一个条件不满足时,它并不会直接停止执行,而是会利用其他条件继续运行下去,直到找到正确的结果为止。因此,Else算法在处理一些较为复杂的问题时,非常有用。
Else算法广泛应用在计算机科学的各个领域,比如图像处理、人工智能、计算机视觉等。在自然语言处理中,Else算法被用来处理不确定的语言构成,比如当需要找到某个单词时,如果没有找到,便会利用上下文、同义词等条件来进行判断和推测。在图像识别中,Else算法便可利用像素点特征等条件来完成对物体实体的识别。
Else算法的优势在于它的多功能性、实用性和适应性。它可以在不同的领域被灵活应用,具有较好的适应性。然而,Else算法也存在一些潜在的劣势,比如由于它是基于条件分支的,那么对于复杂的问题,它的时间复杂度会呈指数级增长,效率不高。同时,当需要遍历的数据量过大时,Else算法的空间复杂度也会增加,带来较大的执行成本。
‘叁’ 有赞搜索引擎实践(算法篇)
注:转自于 有赞
在上篇文章(工程篇)中, 我们介绍了有赞搜索引擎的基本框架. 搜索引擎主要3个部件构成. 第一, hadoop集群, 用于生成大规模搜索和实时索引; 第二, ElasticSearch集群, 提供分布式搜索方案; 第三, 高级搜索集群, 用于提供商业搜索的特殊功能.
商业电商搜索由于搜索的特殊性, 独立的ElasticSearch集群是无法满足多样的算法需求的, 我们在搜索的各个部件上都有相应的算法插件, 用于构建商业电商搜索引擎的算法体系.
创建索引过程从原始数据创建倒排索引的过程. 这个过程中我们对商品(doc)进行分析, 计算商品静态分, 并对商品进行相似度计算. 商品的静态分对于提升搜索引擎质量起到至关重要的作用, 相当于网页搜索的pagerank, 想象一下如果没有pagerank算法, 网页搜索的质量会有多么差. 在电商搜索中, 最常见的问题是相似商品太多, 必须在建立索引过程中就对商品间的相似度进行预计算, 以便在检索过程中进行有效去重.
创建索引的过程如下.
step 1. 计算每个doc的静态分
step 2. 计算两两doc的相似度
step 3. 根据相似度和其他信息对数据进行分库
step 4. 建立ES索引
检索过程是搜索引擎接收用户的query进行一系列处理并返回相关结果的过程. 商业搜索引擎在检索过程中需要考虑2个因素: 1) 相关性 2) 重要性.
相关性是指返回结果和输入query是否相关, 这是搜索引擎基本问题之一, 目前常用的算法有BM25和空间向量模型. 这个两个算法ElasticSearch都支持, 一般商业搜索引擎都用BM25算法. BM25算法会计算每个doc和query的相关性分, 我们使用Dscore表示.
重要性是指商品被信赖的程度, 我们应该吧最被消费之信赖的商品返回给消费者, 而不是让消费之自己鉴别. 尤其是在商品充分竞争的电商搜索, 我们必须赋予商品合理的重要性分数, 才能保证搜索结果的优质. 重要性分, 又叫做静态分, 使用Tscore表示.
搜索引擎最终的排序依据是:
Score = Dscore * Tscore
即综合考虑静态分和动态分, 给用户相关且重要的商品.
检索的过程大致抽象为如下几个步骤.
step 1. 对原始query进行query分析
step 2. 在as中根据query分析结果进行query重写
step 3. 在as中使用重写后的query检索es
step 4. 在es查询过程中根据静态分和动态分综合排序
step 5. 在as中吧es返回的结果进行重排
step 6. 返回结果
下面几章阐述几个重点技术.
在电商搜索引擎里面商品的静态分是有网页搜索里面的pagerank同等的价值和重要性, 他们都是doc固有的和查询query无关的价值度量. pagerank通过doc之间的投票关系进行运算, 相对而言商品的静态分的因素会更多一些. 商品静态计算过程和pagerank一样需要解决如下2个问题: 1. 稳定性. pagerank可以保证一个网站不会因为简单链接堆砌可以线性提升网站的排名. 同样, 商品静态分的计算不可以让商品可以通过增加单一指标线性增加分值(比如刷单对搜索引擎的质量的影响).
2. 区分度. 在保证稳定性的基础上商品静态分要有足够的区分度可以保证同样搜索的条件下, 排在前面的商品的质量比排在后面的商品的质量高.
我们假设商品的静态分有3个决定性因素, 1.下单数, 2. 好评率 3. 发货速度
静态分我们使用Tsocre表示, Tscore可以写成如下形式:
Tscore = a * f(下单数) + b * g(好评率) + c * h(发货速度)
a,b,c是权重参数, 用于平衡各个指标的影响程度. f,g,h是代表函数用于把原始的指标转化成合理的度量.
首先, 我们需要寻找合理的代表函数.
z-score 标准化方法
这种方法非常不稳定, 假设一个奇异点是第二大的值的1000倍, 会让大部分的值都集中在0~0.01, 同样失去了归一化的目的.
(图三: log-zscore归一化)
最后, 选择合适的权重 经过log-zscore归一化以后, 我们基本上吧f,g,h的表示的代表函数说明清楚. Tscore = a f(下单数) + b g(好评率) + c*h(发货速度), 下一步就是确定a,b,c的参数. 一般有两个方法:
a) 专家法. 根据我们的日常经验动态调整权重参数;
b) 实验法. 首先在专家的帮助下赋一个初始值, 然后改变单一变量的方法根据abtest的结果来动态调整参数.
商品标题去重在电商搜索中起到重要作用, 根据数据, 用户通过搜索页购买商品80%选择搜索的前4页. 商品标题的重复会导致重要的页面没有含金量, 极大降低了搜索的购买率.
举个例子:
Title1:美味/香蕉/包邮/广东/高州/香蕉/banana//无/催熟剂/
Title2:美味/香蕉/广东/高州/香蕉//非/粉蕉/包邮/
首先, 进行特征向量化
这里用到 "bag of word" 技术, 将词汇表作为空间向量的维度, 标题的每个term的词频作为这个feature的值. 以这个例子来说. 这个词汇的维度为: 美味(0), 香蕉(1), 包邮(2), 广东(3), 高州(4), banana(5),无(6), 催熟剂(7),非(8),粉蕉(9) 位置: 0,1,2,3,4,5,6,7,8,9
Title1: 1,2,1,1,1,1,1,1,0,0
Title2: 1,2,1,1,1,0,0,0,1,1
这个每个title都用一个固定长度的向量表示.
再次, 计算两两相似度
相似度一般是通过计算两个向量的距离实现的, 不失一般性, 在这里我们使用1-cosine(x,y)来表示两个向量的距离. 这是一个"All Pair Similarity"的问题, 即需要两两比较, 复杂度在O(n^2). 在商品量巨大的时候单机很难处理. 我们给出两种方法用于实现"All Pair Similarity".
方法一: spark的矩阵运算.
方法二: map-rece 线性方法. 这个方法参考论文"Pairwise Document Similarity in Large Collections with MapRece". 可以实现几乎线性的时间复杂度. 相对于矩阵运算在大规模(10亿以上)pair similarity 运算上面有优势. 这个方法简单的描述如下: 首先, 按照倒排索引的计算方式计算每个term到doc的映射. 比如3个doc:
转化为倒排格式, 这个需要一次mapper rece
然后, 对于value只有一个元素的过滤掉, 对于value大于2个doc的两两组合:
最后, 对于输出进行聚合,value为重复次数和两个doc乘积开根号的比.
对于2个title1, title2, 如果X(title1, title2) > 0.7 则认为title1和title2相似, 对于相似的两个doc, 静态分大的定义为主doc, 静态分小的定义为辅doc. 主doc和辅doc分别建库.
区别于网页搜索(网页搜索直接将辅doc删除), 我们将主doc和辅doc分别建库. 每一次搜索按比例分别搜主库和辅库, 并将结果融合返回. 这样可以保证结果的多样性.
店铺去重和商品标题去重有点不同. 由于电商特定场景的需要, 不希望搜索结果一家独大, 这样会引发强烈的马太效应. 店铺去重不能使用如上的方法进行. 因为上面的方法的主要依据是文本相似, 在结果都相关的前提下, 进行适当的取舍. 但是店铺去重不是这样的特性.
设想一下, 如果我们根据店铺是否相同, 把同一店铺的商品分到主库和从库中, 如下图所示.
A和B代表不同的店铺.
在搜索香蕉的时候, 的确可以控制A店铺结果的数量, 但是在搜索"梨"的时候就错误的吧B店铺的梨排在前面了(假设A:梨比B:梨静态分高).
搜索的过程每个桶平均分摊搜索任务的25%, 并根据静态分合并成一页的结果. 这样同一保证结果的相对顺序, 又达到了店铺去重的目的.
如上图所示, 搜索"香蕉", 虽然A店铺有10个满足需求的结果, 但是每页搜索醉倒只有5个结果可以展示.
上面介绍了几个建立索引过程中几项技术, 检索过程中的关键技术有很多. 其中最着名的是query分析技术. 我们使用的query分析技术主要包括核心词识别, 同义词拓展, 品牌词识别等等. query分析技术大部分都是NLP研究范围, 本文就不详细阐述很多理论知识. 我们重点介绍同义词拓展技术. 这个技术一般都需要根据自己的商品和和用户日志特定训练, 无法像分词技术和品牌词识别一样有标准的库可以适用.
同义词拓展一般是通过分析用户session日志获取. 如果一个用户输入"苹果手机"没有得到想要的结果, 他接着输入"iphone", 我们在"苹果手机"和"iphone"之间创建一个转移关系. 基于统计, 我们可以把用户query创建一个相互联系的权重图.
用户输入query "苹果手机", 根据query分析, "苹果手机"有 "iphone" 0.8, "iphone 6" 0.5 两个同义词. 0.8和0.5分别表示同义的程度. 我们想要"苹果手机", "iphone", "iphone 6" 3个query同时输入, 并且按照同义的程度对不同的query赋予不同的权重. ElasticSearch提供的BoostingQuery可以支持这个需求. 参考: https://www.elastic.co/guide/en/elasticsearch/guide/current/ boosting query_clauses.html
原始query:
改写后的Query
其他比如核心词识别, 歧义词纠正等方法差不多, 本文不做详细阐述.
商业电商搜索算法另外两个重要技术, 一个是类目体系建立和应用,另一个是个性化技术. 这个两项技术我们还处在探索阶段. 类目体系我们主要使用机器学习的方法进行训练, 个性化主要通过用户画像进行Query改写来实现. 等我们上线有效果在与大家分享.
搜索算法是一个非常值得一个电商产品持续投入的技术. 一方面我们技术人员要有良好的技术背景, 可以借鉴很多成熟的技术, 避免重复造轮子; 另一方面, 每个产品的搜索都有自身的特点, 需要深入研究产品的特性给出合理的解决方案. 本文给出的案例都具有代表性, 灵活的运用搜索的各方面的技术. 另外, 商业搜索非常看重投入产出比, 我们也需要在众多方案中寻找捷径. 比如我们在做类目体系时候, 没有投入大量的人力资源用于标注数据, 而是通过爬虫爬取其他电商的数据进行参考, 从而节省了80%的人力资源. 由于笔者能力有限, 文中的方案不保证是问题的最优解, 如果有指正, 请联系笔者( [email protected] ).