目录
一、 检索功能概述
二、 实现逻辑:
检索引擎
分词
文本特征提取
降维
计算词频
计算文本相似度
一、检索功能概述
文本检索系统主要采用的是NLP文本挖掘技术,是从文本中获取高质量信息的过程,同时是机器学习下一种无监督式学习方式,其目的是去对原始资料进行分类,把相似的东西聚集在一起,以便了解资料内部结构(监督式学习可以在训练资料中学习或建立一个模式,并依此模式推测新的实例)。文本挖掘的一般流程为1.文本数据源获取,2.数据预处理,3.数据挖掘和可视化,4.搭建模型,5.模型评估。本文主要针对数据预处理(分词,文本特征提取,降维)和数据挖掘(计算相似度,文本聚类)这2个方面进行讲解。
整个检索过程分为是检索与排序, 一共有三个模型,分别是布尔模型、向量空间模型和概率模型等。布尔模型是基于数学集合论的基础用于快速筛选候选内容是否相关,向量空间模型用于计算文档相似性的工具,而概率模型是作为文档与用户需求相关性排序的工具。
检索过程中,常用的文本分析模型是向量空间模型,文档将根据特征词出现频率(或概率)组成多维向量,然后计算向量间的相似度。
二、实现逻辑:
检索模型主要是用于初次计算文本相似度,找出相似的文档集合。
第一步:检索引擎
ElasticSearch是一个基于 Lucene (一个开源全文搜索引擎)构建的是一个分布式可扩展的实时搜索和分析引擎,它还可以:
1.分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
2.实时分析的分布式搜索引擎。
3.可以扩展到上百台服务器,处理PB级别数据( 1PB=1024TB,人类功能记忆约1.25个TB, 800个人相当于1个PB )。
ES是目前全文搜索引擎的首选,它可以快速地储存、搜索和分析海量数据。
第二步:分词-将文本分成系列单词的过程
当用户输入想要查找的文档后,ElasticSearch会使用分词器从文档中提取出若干词元(token)来支持索引的存储和搜索,存储的时候就是按索引存储的,即数据库中的文档在存入时候已经都有索引了,在查询时候不需要再次计算。
1. 分词过程
分词的主体分为3个部分,执行顺序是:字符过滤器--->分词器--->分词过滤器
字符过滤器(Character filters)
字符过滤器以字符流的形式接收原始文本,在文本切割前进行清理操作,如移除HTML标签,并添加、删除或更改字符来转换该流。
分词器(Tokenizer)
将文本切分成独立的单词。分词器接收字符流,并将其拆分成单个分词,并输出一个分词流。例如,分词器会将文本“今天天气怎么样!”转换为[今天, 天气, 怎么样]三个词。实际上是生成了一个字典,并且统计了词频等信息。
分词过滤器(Token filters)
转换字符(如将大写转为小写)、移除停用词(在任何自然语言中停用词是最常用的词,为了分析文本数据和构建NLP模型,这些停用词可能对构成文档的意义没有太多价值,如“啊,的,不”等等)。从给定文本中删除或排除停用词,可以更多地关注定义文本含义的词;
2.常见的分词方式有2种
基于词典匹配
基本思想是基于词典匹配,将待分词的中文文本根据一定规则切分和调整,然后跟词典中的词语进行匹配,匹配成功则按照词典的词分词,匹配失败通过调整或者重新选择,如此反复循环即可。
优点:速度快、成本低
缺点:适应性不强,不同领域效果差异大
基于统计的机器学习
目前常用的是算法是隐马尔可夫模型HMM、条件随机场CRF、支持向量机SVM、深度学习等算法,比如Hanlp分词工具是基于CRF算法。CRF的基本思路是对汉字进行标注训练,不仅考虑了词语出现的频率,还考虑上下文,具备较好的学习能力,因此其对歧义词和未登录词的识别都具有良好的效果。
优点:适应性较强
缺点:成本较高,速度较慢
第三步:文本特征特征提取
因为计算机无法直接读懂文字,需要将文字转换为计算机能读懂语言。
1. 特征提取方法
one-hot是比较常用的文本特征特征提取的方法,比如一组10个字的句子“你今天中午吃了什么菜”,用one-hot表示“你”字,该例子中整个词典大小为10,结果为[1 0 0 0 0 0 0 0 0 0],“今”字结果为[0 1 0 0 0 0 0 0 0 0]。如果文档中有很多词,词向量可能会很长,需要进一步降维。
优点:一是解决了分类器不好处理离散数据的问题,二是在一定程度上也起到了扩充特征的作用。
缺点:在文本特征表示上缺点比较突出。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词之间相互独立(在大多数情况下,词与词是相互影响的);最后,它得到的特征(矩阵)是离散稀疏的。可以加入word embedding,就是把一个one-hot这样的稀疏矩阵映射成一个更稠密的矩阵。
第四步:降维
降维实际上就是降低特征的个数,最终的结果就是特征和特征之间不相关。例如把一个2*5的矩阵转换成一个1*5的矩阵。
1.Word2vec(用来产生词向量的相关模型)
word2vec有2种算法:连续词袋模型(CBOW)和Skip-Gram模型。
连续磁带模型(CBOW)
连续词袋模型会在当前单词的周围创建一个滑动窗口,从“上下文”也就是用它周围的单词预测当前词。 每个单词都表示为一个特征向量。 经过训练以后后,这些向量就成为单词向量。
Skip gram
第二种算法实际上与CBOW相反:我们不是每次都预测一个单词,而是使用1个单词来预测周围的单词。 Skip gram比CBOW慢得多,但是对于不经常使用的单词,它被认为更准确。
2.Doc2ves(用来产生文本向量的相关模型)
它不是仅是使用一些单词来预测下一个单词,还添加了另一个特征向量,即文档Id。因此,当训练单词向量W时,也训练文档向量D,并且在训练结束时,它包含了文档的向量化表示。
第五步:计算词频
TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
根据公式很容易看出,TF-IDF的值与该词在文章中出现的频率成正比,与该词在整个语料库中出现的频率成反比,因此可以很好的实现提取文章中关键词的目的。
优点:简单快速,结果比较符合实际。
缺点:单纯考虑词频,忽略了词与词的位置信息以及词与词之间的相互关系。
第六步:计算文本相似度
当对用户输入的文本进行降维操作后,即可使用余弦相似度公式进行文本相似度计算。数据库中的法条向量是已经计算好的。
1. 余弦相似度
我们可以把它们想象成空间中的两条线段,都是从原点([0,0])出发,指向不同的方向。
两条线段之间形成一个夹角,如果夹角越接近0度,余弦值会越接近1,也就是两个向量越相似,如下图所示。
上图两个向量a,b的夹角很小,可以说两个向量有很高的的相似性。
极端情况下,a和b向量完全重合,可以认为两个向量是相等的,也即a,b向量代表的文本是完全相似的,或者说是相等的,如下图所示:
如果a和b向量夹角较大,或者反方向,可以说两个向量的相似性很低,或者说a和b向量代表的文本基本不相似,如下图所示:
2. 计算余弦相似度
余弦函数在三角形中的计算公式为:
在向量表示的三角形中,假设a向量是(x1, y1),b向量是(x2, y2),那么可以将余弦定理改写成下面的形式:
向量a和向量b在直角坐标中的长度为:
向量a和向量b之间的距离我们用向量c表示,那么向量c在直角坐标系中的长度为:
将a,b,c带入三角函数的公式中得到如下的公式:
参考:
Elasticsearch分词器 | 废物大师兄
Doc2Vec的简介及应用 | GidiShperber
余弦计算相似度度量 | 京东云成都
搜索引擎产品经理的工作日常 | 飞鱼船长