有没有办法我们可以使用lucene来发现基于搜索查询的单词的相关性

时间:2015-04-28 21:20:20

标签: solr lucene machine-learning autosuggest

所有

我想知道是否有任何方法可以使用lucene根据搜索历史进行搜索关键字相关性发现?

例如:

代码可以读取用户搜索字符串,解析它,提取关键字并找出在搜索时最有可能聚集在一起的单词。

当我尝试Solr时,我发现lucene有很多文本分析功能,这就是为什么我想知道是否有任何方法我们可以使用它并与其他机器学习库结合(如果需要)来实现我的目标。

由于

1 个答案:

答案 0 :(得分:0)

是和否。

它应该工作。只需将每个关键字视为文档,然后使用lucene的MoreLikeThis功能,它会根据原始查询中的术语动态构建lucene查询。然后使用lucenue查询在索引中查找其他类似文档(关键字)。

MoreLikeThis mlt = new MoreLikeThis(reader); // Pass the index reader
mlt.setFieldNames(new String[] {"keywords"}); // specify the field for similarity

Query query = mlt.like(docID); // Pass the doc id 
TopDocs similarDocs = searcher.search(query, 20); // Use the searcher
if (similarDocs.totalHits == 0)
    // Do handling
}

假设您的索引关键字中包含

等关键字
iphone 6
apple iphone
iphone on sale
apple and fruit
apple and pear

当您使用“iphone”启动查询时,由于“iphone”的完整术语匹配,我相信您会发现上面的前三个关键字“最相似”。

没有

lucene中的默认相似性功能从未理解iphone与Apple Inc相关,因此iphone与“apple store”相关。如果您的原始查询只是“苹果商店”,那么您当前关键字中的理想搜索结果如下(按从高到低的相关性排序):

apple iphone
iphone 6
iphone on sale

不幸的是,你会得到以下结果:

apple iphone
apple and fruit
apple and pear

第一个是伟大的,但其他两个是完全无关的。要获得真实相关性发现(使用语义),您需要完成更多工作topic modeling。如果您碰巧有一个很好的方式(例如,预先训练的LDA模型或wordvec)来预处理每个关键字并生成主题ID列表,您可以将这些主题ID存储在每个关键字文档的单独字段。如下所示:

[apple iphone]      ->  topic_iphone:1.0, topic_apple_inc:0.8
[apple and fruit]   ->  topic_apple_fruit:1.0
[apple and pear]    ->  topic_apple_fruit:0.99, topic_pear_fruit:0.98

其中每个关键字也映射到具有权重值的一些主题ID。

在查询时,您应该运行相同的主题建模工具,以便为原始查询及其术语生成主题ID。例如,

[apple store]       ->  topic_apple_inc:0.75, topic_shopping_store:0.6

现在您应该合并两个字段(关键字和主题)来计算整体相似度。