Stay hungry. Stay foolish.

0%

NLP_similarity

企图用lucene的默认打分算法BM25similarity直接解决项目问题前对文本相似度匹配算法的最后挣扎,将前面搜集到的一些资料再重新看一遍

博文学习1

先过一遍学习自:https://segmentfault.com/a/1190000018328273

文本距离的概念

  1. 欧几里得距离:二维,三维……两点之间的直线距离

  2. 曼哈顿距离:两个点上在标准坐标系上的绝对轴距之总和

  3. 切比雪夫距离:将两点之间的距离定义为其各坐标数值差的最大值

  4. 余弦距离:相比于欧几里德距离,余弦距离更加注重的是两个向量在方向上的差。欧几里德距离衡量的是空间中两点的绝对距离,跟各个点所在的位置坐标是直接相关的;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。

  5. 汉明距离:在信息论中,表示为两个「等长」字符串之间对应位置的不同字符的个数。换句话说,汉明距离就是将一个字符串变换成另外一个字符串所需要「替换」的字符个数。

分词及分词方法

直接用现在成熟的中文分词方案,看看lucene里面支持什么

文本相似度算法

  1. 基于词向量

  2. 基于具体字符

  3. 基于概率统计

  4. 基于词嵌入

重点分析:

基于余弦复杂度的文本相似度比较算法

适用于海量数据的simhash文本相似度算法

余弦复杂度(计算余弦)

将这些文本中词语,映射到向量空间,形成文本中文字和向量数据的映射关系,再通过计算几个或者多个不同的向量的差异的大小,来计算文本的相似度。

1.找出两篇文章的关键词;
2.每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频;
3.生成两篇文章各自的词频向量;
4.计算两个向量的余弦相似度,值越接近于1就表示越相似;

评价:简单但是效率低,无法处理海量数据

simhash

为了在爬取网页时用于快速去重,Google发明了一种快速衡量两个文本集相似度的算法:simhash

simhash中使用了一种局部敏感型的hash算法。所谓局部敏感性hash,与传统hash算法不同的是(如MD5,当原始文本越是相似,其hash数值差异越大),simhash中的hash对于越是相似的内容产生的签名越相近。

simhash的主要思想是降维,将文本分词结果从一个高维向量映射成一个0和1组成的bit指纹(fingerprint),然后通过比较这个二进制数字串的差异进而来表示原始文本内容的差异。

主要是降维了,最后生成一个向量指纹(01字符串),通过汉明距离比较。多认为两个文本的汉明距离<=3的话则认定是相似的。

  1. 一个对结果判定很重要的参数:分词数量。当大文本内容出现时,选择合适的topN分词数量进行比较对结果的影响是十分大的。

  2. simhash的优点是适用于高维度的海量数据处理,当维度降低,如短文本的相似度比较,simhash并不合适。simhash对于短文本的相似度比较还是存在一些偏差的

分词问题本身这一步就是个大问题

引用自:https://www.zhihu.com/question/19578687

中文句子中没有词的界限,因此在进行中文自然语言处理时,通常需要先进行分词,分词效果将直接影响词性、句法树等模块的效果。当然分词只是一个工具,场景不同,要求也不同。

常见的分词器都是使用机器学习算法和词典相结合,一方面能够提高分词准确率,另一方面能够改善领域适应性。

随着深度学习的兴起,也出现了基于神经网络的分词器,例如有人员尝试使用双向LSTM+CRF实现分词器,其本质上是序列标注,所以有通用性,命名实体识别等都可以使用该模型,据报道其分词器字符准确率可高达97.5%。

目前中文分词难点主要有三个:

1、分词标准:比如人名,在哈工大的标准中姓和名是分开的,但在Hanlp中是合在一起的。这需要根据不同的需求制定不同的分词标准。

2、歧义:对同一个待切分字符串存在多个分词结果。

歧义又分为组合型歧义、交集型歧义和真歧义三种类型。

一般在搜索引擎中,构建索引时和查询时会使用不同的分词算法。常用的方案是,在索引的时候使用细粒度的分词以保证召回,在查询的时候使用粗粒度的分词以保证精度。

博文学习2

引自:https://www.cnblogs.com/xlturing/p/6136690.html

衡量两个字符串的相似性有很多种方法,如最直接的利用hashcode,以及经典的主题模型或者利用词向量将文本抽象为向量表示,再通过特征向量之间的欧式距离或者皮尔森距离进行度量。

  • 字面度量

  • 语义度量

想要做到语义层面的度量,我们需要用到机器学习建模,而自然语言的问题转化为机器学习的首要问题便是找到一种方法把自然语言的符号数学化。

在自然语言处理领域中,有两大理论方向,一种是基于统计的经验主义方法,另一种是基于规则的理性主义方法。而随着计算机性能的提升,以及互联网发展而得到的海量语料库,目前NLP的研究更多是基于统计的经验主义方法。

整理得非常好,有很多数学公式及原理图,回来看。

博文学习3

生动解释什么是TF-IDF算法

bert模型

好像离要解决的问题越来越远了……
1.https://zhuanlan.zhihu.com/p/46652512
2.https://www.zhihu.com/question/298203515?from=timeline&isappinstalled=0&utm_medium=social&utm_source=wechat_session

看的一些中文论文的说法

从计算步骤来看,文本相似度主要分为文本表示、特征提取和相似度计算三个过程,下面就这三个过程对目前文本相似度计算研究进展进行概述:
(1)文本表示:文本表示模型主要可分为两种:基于词袋模型和基于语义模型。在词袋模型中,向量空间模型(VSM)简单高效,应用最为广泛,但往往存在纬度高和语义缺失等问题。基于语义模型的文本表示方法正是众多学者在VSM的基础上加入词汇间的语义关系形成的。
(2)特征提取:过滤掉无关信息同时实现文本降维。传统的TF-IDF方法没有考虑到文本上下文的结构信息,改进的PageRank算法提取文本关键词,准确率比传统方法有所提升。
(3)相似度计算:VSM仅利用文本间相同词计算相似度,忽略了不同词间的相关度。Word2Vec自被提出以来,可以成功解决文本特征的维数灾难问题,通过词嵌入基于神经网络训练大量语料库,将训练集中每个词语映射为特定长度的向量,以此计算词语间的语义相似度。

最后准备用现成接口直接搜索打分来匹配

1.https://www.elastic.co/guide/cn/elasticsearch/guide/current/scoring-theory.html

借鉴TF-IDF和向量空间模型,加入一些新特性
使用布尔模型。。。好像不大行啊。