一、词项相似度

elasticsearch支持拼写纠错,其建议词的获取就需要进行词项相似度的计算;今天我们来通过不同的距离算法来学习一下词项相似度算法;

二、数据准备

计算词项相似度,就需要首先将词项向量化;我们可以使用以下两种方法

字符向量化,其将每个字符映射为一个唯一的数字,我们可以直接使用字符编码即可;

import numpy as np

def vectorize_words(words):
lower_words = [word.lower() for word in words]
words = [np.array([ord(c) for c in word]) for word in lower_words]
return words vlan = 'valn'
vlna = 'vlna'
vlan233 ='vlan233'
http='http' vlan_vector, vlna_vector, vlan233_vector, http_vector = vectorize_words([vlan, vlna, vlan233, http])
print(f'vlan_vector: {vlan_vector}')
print(f'vlna_vector: {vlna_vector}')
print(f'vlan233_vector: {vlan233_vector}')
print(f'http_vector: {http_vector}') vlan_vector: [118 97 108 110]
vlna_vector: [118 108 110 97]
vlan233_vector: [118 108 97 110 50 51 51]
http_vector: [104 116 116 112]

三、汉明距离

汉明距离是非常流行的距离度量方法,在信息和通信领域中有广泛的使用;其表示两个长度相等的字符串之间互异字符或符号的数量。考虑长度为n的两个词项u和v,汉明距离的数学表达式为:

\[hd(u,v)=\sum_{i}^{n}(u_{i}\ne v_{i} )
\]

同时也可以通过除以词的总长度来计算归一化的汉明距离

\[norm\_hd(u,v) = \frac {\sum_{i}^{n}(u_{i}\ne v_{i} )} {n}
\]

我们使用以下的hamming_distance来计算汉明编辑距离,并通过参数norm来控制是否进行归一化;

def hamming_distance(u, v, norm=True):
if u.shape != v.shape:
raise ValueError('the vector must have equal lenghts.') return (u!=v).mean() if norm else (u!=v).sum()

我们通过以下代码来计算valn跟其他三个词的汉明距离;

通过输出信息我们可以看到最小的编辑距离是2,归一化之后是0.5;

vlan = 'vlan'
vlna = 'vlna'
http='http'
words = [vlan, vlna, http] input_word = 'valn'
input_vector = vectorize_words([input_word]).pop() word_vectors = vectorize_words(words)
for word, vector in zip(words, word_vectors):
print(f'{input_word} and {word} hamming distance is {hamming_distance(input_vector, vector, norm=False)}') print()
for word, vector in zip(words, word_vectors):
print(f'{input_word} and {word} hamming distance is {hamming_distance(input_vector, vector)}') valn and vlan hamming distance is 2
valn and vlna hamming distance is 3
valn and http hamming distance is 4 valn and vlan hamming distance is 0.5
valn and vlna hamming distance is 0.75
valn and http hamming distance is 1.0

四、曼哈顿距离

曼哈顿距离主要计算两个字符串每个位置上的字符之间的差值之和;曼哈顿距离也称为城市街区距离、L1范数、计程车度量;

同样长度为n的两个词u、v,曼哈顿距离的数学公式为

\[md(u,v)=\|u - v\|_{1} = \sum_{i=1}^{n}|u_{i} - v_{i}|
\]

同样我们也可以除以词的长度来计算曼哈顿规划距离

\[norm\_md(u,v)=\frac {\|u - v\|_{1}} {n} = \frac {\sum_{i=1}^{n}|u_{i} - v_{i}|} {n}
\]

我们可以使用以下方法来计算曼哈顿距离,同样通过norm来控制归一化;

def manhattan_distance(u, v, norm=True):
if u.shape != v.shape:
raise ValueError('the vector must have equal lenghts.') return abs(u-v).mean() if norm else abs(u-v).sum()

使用同样的词,使用以下代码计算曼哈顿距离;

同样可以看到距离最小的valn和vlan的曼哈顿距离是22,归一化之后是5.5;

vlan = 'vlan'
vlna = 'vlna'
http='http'
words = [vlan, vlna, http] input_word = 'valn'
input_vector = vectorize_words([input_word]).pop()
word_vectors = vectorize_words(words)
for word, vector in zip(words, word_vectors):
print(f'{input_word} and {word} manhattan distance is {manhattan_distance(input_vector, vector, norm=False)}') print()
for word, vector in zip(words, word_vectors):
print(f'{input_word} and {word} manhattan distance is {manhattan_distance(input_vector, vector)}') valn and vlan manhattan distance is 22
valn and vlna manhattan distance is 26
valn and http manhattan distance is 43 valn and vlan manhattan distance is 5.5
valn and vlna manhattan distance is 6.5
valn and http manhattan distance is 10.75

五、欧几里得距离

欧几里得距离计算两点之间最短的直线距离,也称为欧几里得范数、L2范数或L2距离;

同样长度为n的两个词u、v,欧几里得距离的数学公式为

\[ed(u,v)=\|u - v\|_{2} = \sqrt{\sum_{i=1}^{n}(u_{i} - v_{i})^2}
\]

我们使用以下方法计算欧几里得距离

def euclidean_distance(u, v):
if u.shape != v.shape:
raise ValueError('the vector must have equal lenghts.') return np.sqrt(np.sum(np.square(u - v)))

同样的关键字,使用以下代码计算欧几里得距离;

vlan = 'vlan'
vlna = 'vlna'
http='http'
words = [vlan, vlna, http] input_word = 'valn'
input_vector = vectorize_words([input_word]).pop()
word_vectors = vectorize_words(words)
for word, vector in zip(words, word_vectors):
print(f'{input_word} and {word} euclidean distance is {euclidean_distance(input_vector, vector)}') valn and vlan euclidean distance is 15.556349186104045
valn and vlna euclidean distance is 17.146428199482248
valn and http euclidean distance is 25.0

elasticsearch算法之词项相似度算法(一)的更多相关文章

  1. elasticsearch算法之词项相似度算法(二)

    六.莱文斯坦编辑距离 前边的几种距离计算方法都是针对相同长度的词项,莱文斯坦编辑距离可以计算两个长度不同的单词之间的距离:莱文斯坦编辑距离是通过添加.删除.或者将一个字符替换为另外一个字符所需的最小编 ...

  2. elasticsearch算法之推荐系统的相似度算法(一)

    一.推荐系统简介 推荐系统主要基于对用户历史的行为数据分析处理,寻找得到用户可能感兴趣的内容,从而实现主动向用户推荐其可能感兴趣的内容: 从物品的长尾理论来看,推荐系统通过发掘用户的行为,找到用户的个 ...

  3. ElasticStack学习(九):深入ElasticSearch搜索之词项、全文本、结构化搜索及相关性算分

    一.基于词项与全文的搜索 1.词项 Term(词项)是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term. Term的使用说明: 1)Term Level Query:Ter ...

  4. elasticsearch高亮之词项向量

    一.什么是词项向量 词项向量(term vector)是有elasticsearch在index document的时候产生,其包含对document解析过程中产生的分词的一些信息,例如分词在字段值中 ...

  5. 百度面试题 字符串相似度 算法 similar_text 和页面相似度算法

    在百度的面试,简直就是花样求虐. 首先在面试官看简历的期间,除了一个自己定义字符串相似度,并且写出求相似度的算法. ...这个确实没听说过,php的similar_text函数也是闻所未闻的.之前看s ...

  6. 关联规则—频繁项集Apriori算法

    频繁模式和对应的关联或相关规则在一定程度上刻画了属性条件与类标号之间的有趣联系,因此将关联规则挖掘用于分类也会产生比较好的效果.关联规则就是在给定训练项集上频繁出现的项集与项集之间的一种紧密的联系.其 ...

  7. Spark/Scala实现推荐系统中的相似度算法(欧几里得距离、皮尔逊相关系数、余弦相似度:附实现代码)

    在推荐系统中,协同过滤算法是应用较多的,具体又主要划分为基于用户和基于物品的协同过滤算法,核心点就是基于"一个人"或"一件物品",根据这个人或物品所具有的属性, ...

  8. python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表

    目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...

  9. FP-Growth算法之频繁项集的挖掘(python)

    前言: 关于 FP-Growth 算法介绍请见:FP-Growth算法的介绍. 本文主要介绍从 FP-tree 中提取频繁项集的算法.关于伪代码请查看上面的文章. FP-tree 的构造请见:FP-G ...

随机推荐

  1. wordpress的.htaccess很容易就被挂马啊

    wordpress的.htaccess很容易就被挂马啊 修改成这样吧: # BEGIN WordPress<IfModule mod_rewrite.c>RewriteEngine OnR ...

  2. JS验证身份证是否符合规则

    调用isIdCardNo(num)  验证通过返回true 错误返回false function isIdCardNo(num) { var factorArr = new Array(7, 9, 1 ...

  3. Caused by: java.lang.NoClassDefFoundError: javax/jms/Message报错

    Caused by: java.lang.NoClassDefFoundError: javax/jms/Message at java.lang.Class.getDeclaredMethods0( ...

  4. VS c/c++常用配置项

    VS2015 下面的配置,Vs是通用的 自己常用VS2015, 但其默认的一些设置不能满足我的日常. 比较熟悉c/c++, 以下配置仅适用c/c++ 设置方法: 工具-选项-文本编辑器-c/c++ 常 ...

  5. 【LeetCode】932. Beautiful Array 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 构造法 递归 相似题目 参考资料 日期 题目地址:h ...

  6. 【LeetCode】917. Reverse Only Letters 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 单指针 双指针 日期 题目地址: https:/ ...

  7. 永中dcs实现浏览器上面的手绘效果

    永中dcs是一款在线预览各种办公文件的网络产品,我们可以只用一个浏览器就可以实现对word,ppt和excel等文件的在线浏览,在其中有一个在线手绘功能很有特色,让我们来探一探它的实现原理吧. 第一, ...

  8. 七、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-聊天消息项的实现

    会话好友列表的实现 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展 ...

  9. kafka2.x常用命令笔记(一)创建topic,查看topic列表、分区、副本详情,删除topic,测试topic发送与消费

    接触kafka开发已经两年多,也看过关于kafka的一些书,但一直没有怎么对它做总结,借着最近正好在看<Apache Kafka实战>一书,同时自己又搭建了三台kafka服务器,正好可以做 ...

  10. ☕【难点攻克技术系列】「海量数据计算系列」如何使用BitMap在海量数据中对相应的进行去重、查找和排序

    BitMap(位图)的介绍 BitMap从字面的意思,很多人认为是位图,其实准确的来说,翻译成基于位的映射,其中数据库中有一种索引就叫做位图索引. 在具有性能优化的数据结构中,大家使用最多的就是has ...