【Python机器学习】NLP词频背后的含义——主题向量的威力

通过使用主题向量,我们可以比较词、文档、语句和语料库的含义,也可以找到相似文档和语句的“簇”。我们不再仅仅根据词的用法来比较文档之间的距离,也不再局限于完全基于词的选择或词汇表进行关键词搜索和相关性排名。现在,我们可以找到与查询相关的文档,而不仅仅只是与词统计信息本身很好的匹配。

这被称为语义搜索(不要与语义Web混淆)。当文档不包含查询词但实际却与查询相关时,强大的搜索引擎通过语义搜索实现上述查询和文档的匹配。这些高级搜索引擎使用LSA主题向量,来区分Python Package Index中的Python包和Python(蟒蛇意),同时仍然能识别出它们与Ruby gem的相似之处。

例如,要在二维向量上执行查询,比如在地图上的经纬度位置,我们可以快速找到附近的所有咖啡店,而无须进行太多搜索。我们只需要扫描附近的位置,然后向外螺旋式搜索即可。或者,我们可以用代码创建越来越大的边界框,检查某个范围内的经纬度。在超空间中使用超平面和超立方体来形成搜索的边界是不可能的。

语义搜索

当根据文档中包含的词或部分词搜索文档时,称为全文搜索,这就是搜索引擎所做的事情。它们将文档分成块(通常是词),这些块可以像教科书后面的索引那样用倒排序列来建立索引。它利用大量簿记和猜测来处理拼写错误和录入错误,但效果非常好。

语义搜索也是一种全文搜索,但它会考虑词在查询和正在搜索的文档中的含义。利用LSA和LDiA可以计算主题向量,它们在向量中捕捉了词和文档的语义(意义),隐性语义分析最初被称为隐性语义索引的原因之一是:它承诺用一个数值索引(如词袋表和TF-IDF表)来支持语义搜索。语义搜索将是信息检索的下一件大事。

与词袋表和TF-IDF表不同的是传统的倒排索引技术很难对语义向量表进行离散化和索引处理。传统的索引方法适用于二值词出现向量、离散向量(词袋向量)、稀疏连续向量(TF-IDF向量)和低维连续向量(三维GIS数据)。但是高维连续向量,比如来自LSA或LDiA的主题向量,是一个挑战。倒排索引适用于离散向量或二值向量,就像二值或整数型词-文档向量表一样,因为索引只需要为每个非零的离散维度维护一个条目,该维度的值子啊引用的向量或文档中可能存在也可能不存在。由于TF-IDF向量是稀疏的,大部分为零,因此对于大多数文档的大多数维度,索引中不需要有对应条目。

LSA(和LDiA)生成高维、连续和密集的主题向量(零很少)。并且,语义分析算法无法生成一个高效的用于可扩展搜索的索引。事实上,“维数灾难”问题使得精确索引是不可能的。隐性语义索引的“索引”是一种希望,而不是现实,所以LSI是一个容易误导的名称。也许这就是LSA成为描述产生主题向量的语义分析算法的更流行的方法的原因。

解决高维向量问题的一种方法是使用局部敏感哈希(LSH)来进行索引。LSH类似于邮政编码,它指定一个超空间区域,以便后续可以轻松找到它。和常规哈希一样,它是离散的,只依赖向量中的值。但一旦向量超过约12维,LSH也不是很奏效。

下表中,每一行表示一个主题向量的大小(维数),该维数从二维开始,一直到16维:

维数第100个余弦距离前1位是否正确前2位是否正确前10位是否正确前100位是否正确
2.00TRUETRUETRUETRUE
3.00TRUETRUETRUETRUE
4.00TRUETRUETRUETRUE
5.01TRUETRUETRUETRUE
6.02TRUETRUETRUETRUE
7.02TRUETRUETRUEFALSE
8.03TRUETRUETRUEFALSE
9.04TRUETRUETRUEFALSE
10.05TRUETRUEFALSEFALSE
11.07TRUETRUETRUEFALSE
12.06TRUETRUEFALSEFALSE
13.09TRUETRUEFALSEFALSE
14.14TRUEFALSEFALSEFALSE
15.14TRUETRUEFALSEFALSE
16.09TRUETRUEFALSEFALSE

上表展示了使用LSH对大量语义向量进行索引时的搜索效果。一旦向量超过16维,就很难返回两个好的搜索结果。

我们已经知道了如何使用LSA将查询串转换为主题向量,还知道如何使用余弦相似度评分(标量积、内积或点积)来比较两个向量的相似度从而找到最接近的匹配结果。要找到精确的语义匹配,我们需要找到与特定查询(搜索)主题向量最接近的所有文档主题向量。但如果我们有n篇文档,则必须对查询主题向量进行n次比较,这里有大量的点积计算。

我们可以使用矩阵乘法将numpy中的运算向量化,但这不会减少运算的数量,而只会让运算的速度提高100倍。基本的情况是,精确的语义搜索仍然需要对每个查询进行O(n)次乘法和加法运算,因此它的扩展只与语料库的大小呈线性关系。这对大规模语料库来说是行不通的。

关键的是,我们为高维向量设定一个足够好的索引方法即可,并不追求完美的索引或LSH算法。下面有几个使用LSH来高效地实现语义搜索的开源实现,它们实现了一些高效、精确的近似最近邻算法:

  • Spotify的Annoy软件包
  • Gensim的gensim.models.KeyedVector类

从技术上讲,这些索引或哈希解决方案并不能保证找到所有与语义搜索查询匹配的最佳结果。但是,如果能接受放弃一点精确率的话,它们几乎可以像传统的TF-IDF向量或词袋向量的倒排索引一样,快速得到一个很好的近似匹配列表。

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值