我的目标是在搜索引擎项目中提供一个搜索框的所有模型,就像LinkedIn一样。
我试图用一个类比来表达我的问题。
假设每个结果都是一篇文章,并且有多个维度,如作者、主题、会议(如果是出版物(、托管网站等。
一些示例查询:
"作者XYZ在IEEE的信息检索论文":三维{主题,会议名称,作者名称}
"authoABC关于设计模式的ACM论文":三个维度{conf-name,author,topic}
"Javaranch的多线程编程":二维{主题,网站}
我必须在大型查询中识别这些维度和相应的关键字,然后才能从数据库中检索最终结果。
点
- 我可以访问所有维度的所有可能值。例如,我有所有的会议名称、作者姓名等。
- 跨维度的术语重叠很少。
我的方法(幼稚(
- 使用
Lucene,使用一个名为"dimension"的专用字段和另一个具有实际值的字段为每个维度中的所有关键字编制索引。 前任:
1( {名称:IEEE, 维度:会议} 等
2( {名称:OOAD, 维度:主题}, 等等。
3( {名称:XYZ, 维度:作者}, 等等。
- 按原样使用查询搜索索引。
- 在一定程度上循环访问结果,并识别具有新维度的第一个文档。
问题
- 不确定何时停止识别结果集中的维度。 例如,查询可能只包含两个维度,但结果可能与 3 个维度匹配。
- 如果我也想包括拼写检查,它会变得更加复杂,结果往往不太准确。
引用论文、文章或指出描述我的问题域等的正确术语肯定会有所帮助。
任何指导都非常感谢。
解决方案1:那么使用自然语言处理命名实体识别(NER(解决您的问题怎么样。现在可以使用简单的正则表达式来完成 NER(在数据过于静态的情况下(,或者您可以使用一些机器学习技术(如隐马尔可夫模型(来实际找出序列数据集中的命名实体。为什么我强调HMM与其他机器学习监督算法相比,是因为您有顺序数据,每个状态都依赖于上一个或下一个状态。NER 将为您输出维度以及相应的名称。之后,您的搜索成为垂直搜索问题,您只需在不同的 Solr/Lucene 字段中搜索识别的单词并相应地设置您的提升。
现在进入实现部分,我假设你在使用 Lucene 时了解 Java,所以 Mahout 是一个不错的选择。Mahout内置了HMM,您可以在数据集上训练+测试模型。我还假设您拥有大型数据集。
解决方案 2:尝试将此问题建模为属性图问题。看看像Neo4j这样的东西。我建议这样做,因为您的问题属于无模式域。您的模式不是固定的,问题可以很好地建模为一个图形,其中每个节点都是一组键值对。
解决方案 3:正如您所说,您拥有所有可能的维度值,而不是其他任何东西,为什么不使用正则表达式将所有非结构化数据从文本转换为结构化数据,并且由于您没有固定的架构,因此将数据存储在任何 NoSQL 键值数据库中。他们中的大多数都提供了Lucene Integrations用于全文搜索,然后简单地在这些数据库上进行搜索。
做的是计算查询和您正在查找的文档集之间的相似性。余弦相似性等度量应该可以满足您的需求。但是,您可以使用的技巧是计算文档的 Tf/idf 并使用该分数创建一个索引,您可以从那里选择合适的索引。我建议您研究向量空间模型以找到满足您需求的方法!!也看看这个算法http://en.wikipedia.org/wiki/Okapi_BM25