3

我的目标是在搜索引擎项目(如 LinkedIn)中提供一个搜索框的所有模型。

我试图用一个类比来表达我的问题。

假设每个结果都是一篇文章,并且具有多个维度,例如作者、主题、会议(如果是出版物)、托管网站等。

一些示例查询:

  • 《作者XYZ在IEEE的信息检索论文》:三个维度{topic, conf-name, authorname}

  • “authoABC 设计模式的 ACM 论文”:三个维度 {conf-name, author, topic}

  • “javaranch 的多线程编程”:二维{主题、网站}

在从数据库中检索最终结果之前,我必须在大查询中识别这些维度和相应的关键字。

积分

  • 我可以访问所有维度的所有可能值。例如,我有所有的会议名称、作者姓名等。
  • 跨维度的术语几乎没有重叠。

我的方法(天真)

  • 使用 Lucene,用一个名为“维度”的专用字段和另一个具有实际值的字段来索引每个维度中的所有关键字。前任:

    1){名称:IEEE,维度:会议}等。

    2) {name:ooad, dimension:topic}等

    3){名称:xyz,维度:作者}等。

  • 使用查询原样搜索索引。
  • 在某种程度上迭代结果并识别具有新维度的第一个文档。

问题

  • 不确定何时停止识别结果集中的维度。例如,查询可能只包含两个维度,但结果可能匹配 3 个维度。
  • 如果我也想包括拼写检查,它会变得更复杂,结果往往不太准确。

参考论文、文章或指出描述我的问题领域的正确术语等肯定会有所帮助。

非常感谢任何指导。

4

2 回答 2

2

解决方案 1:那么如何使用自然语言处理命名实体识别 (NER) 来解决您的问题。现在 NER 可以使用简单的正则表达式来完成(以防数据过于静态),或者您可以使用一些机器学习技术(如隐马尔可夫模型)来实际找出序列数据集中的命名实体。与其他机器学习监督算法相比,为什么我强调 HMM 是因为你有顺序数据,每个状态都依赖于前一个或下一个状态。NER 会为您输出尺寸以及相应的名称。之后,您的搜索变成了垂直搜索问题,您只需在不同的 Solr/Lucene 字段中搜索已识别的单词并相应地设置您的提升。

现在进入实现部分,我假设您在使用 Lucene 时了解 Java,因此 Mahout 是一个不错的选择。Mahout 内置了 HMM,您可以在数据集上训练和测试模型。我还假设您有大型数据集。

解决方案 2:尝试将此问题建模为属性图问题。看看像 Neo4j 这样的东西。我建议这样做,因为您的问题属于架构较少的域。您的模式不是固定的,问题可以很好地建模为一个图,其中每个节点都是一组键值对。

解决方案 3:正如您所说,您拥有所有可能的维度值,为什么不使用正则表达式简单地将所有非结构化数据从文本转换为结构化数据,因为您没有固定架构,所以将数据存储在任何 NoSQL 键值数据库。他们中的大多数都为全文搜索提供了 Lucene 集成,然后简单地在这些数据库上进行搜索。

于 2013-10-10T07:57:29.123 回答
1

您需要做的是计算查询与您正在查看的文档集之间的相似度。余弦相似度等度量应该满足您的需求。但是,您可以使用的一种技巧是计算文档的Tf/idf并使用该分数创建一个索引,您可以从那里选择合适的分数。我建议您查看向量空间模型以找到满足您需求的方法!看看这个算法 http://en.wikipedia.org/wiki/Okapi_BM25

于 2013-10-10T06:56:26.617 回答