4

我有一个巨大的人名列表,我必须在一个巨大的文本中搜索。

只有部分名称可能出现在文本中。并且有可能拼写错误输入错误或缩写。文本没有标记,所以我不知道文本中人名的开始位置。而且我不知道这个名字是否会出现在文本中。

例子:

我的列表中有“Barack Hussein Obama”,因此我必须检查以下文本中是否出现了该名称:

  • ...The candidate Barack Obama was elected the president of the United States... (incomplete)
  • ...The candidate Barack Hussein was elected the president of the United States... (incomplete)
  • ...The candidate Barack HO was elected the president of the United States... (abbreviated)
  • ...The candidate Barack ObaNa was elected the president of the United States... (misspelled)
  • ...The candidate Barack OVama was elected the president of the United States... (misstyped, B is next to V)
  • ......候选人约翰麦凯恩在选举中失败......(没有出现奥巴马的名字)

当然,它没有确定性的解决方案,但是......

对于这种搜索,什么是好的启发式方法?

如果必须,你会怎么做?

4

8 回答 8

6

你说它大约有200页。

将其分成 200 个单页 PDF。

把每一页放在 Mechanical Turk 上,连同名字列表。提供每页约 5 美元的奖励。

于 2008-12-23T20:51:59.310 回答
5

将所有内容拆分为删除特殊字符(逗号、句点等)的空格。然后使用soundex 之类的东西来处理拼写错误。或者,如果您需要搜索大量文档,则可以使用lucene之类的东西。

于 2008-12-03T21:12:34.773 回答
2

你想要的是一个自然语言处理库。您正在尝试识别专有名词的子集。如果名称是专有名词的主要来源,那么如果混入相当数量的其他专有名词就容易了,但难度会更大。如果您使用 JAVA 编写代码,请查看 OpenNLP 或 C# SharpNLP。提取所有专有名词后,您可能可以使用 Wordnet 删除大多数非名称专有名词。您可以使用 wordnet 来识别名称的子部分,例如“John”,然后搜索相邻的标记以吸收名称的其他部分。你会遇到像“John Smith Industries”这样的问题。您将不得不查看您的基础数据,看看是否有您可以利用的功能来帮助缩小问题。

使用 NLP 解决方案是我见过的解决类似问题的唯一真正强大的技术。您可能仍然有问题,因为 200 页实际上相当小。理想情况下,您将拥有更多文本并能够使用更多统计技术来帮助消除名称和非名称之间的歧义。

于 2008-12-20T16:05:55.270 回答
1

我会使用 C# 和 LINQ。我会标记空间上的所有单词,然后使用 LINQ 对文本进行排序(并可能使用 Distinct() 函数)来隔离我感兴趣的所有文本。在处理文本时,我会跟踪索引(您可以使用 LINQ),以便我可以重新定位原始文档中的文本 - 如果这是一个要求。

于 2008-12-24T03:20:33.580 回答
1

乍一看,我要买一个索引服务器。lucene、FAST 或 Microsoft 索引服务器。

于 2008-12-03T21:15:38.590 回答
0

SQL ServerOracle都有内置的 SOUNDEX 函数。

此外,还有一个名为 DIFFERENCE 的 SQL Server 内置函数可以使用。

于 2008-12-03T21:24:33.547 回答
0

我能想到的最好方法是在 python NLTK中定义语法。但是,对于您想要的东西,它可能会变得非常复杂。

我会亲自使用正则表达式,同时通过一些编程生成排列列表。

于 2008-12-03T21:08:28.650 回答
-1

纯旧的正则表达式脚本将完成这项工作。

使用 Ruby,它非常快。阅读行并匹配单词。

干杯

于 2008-12-03T22:20:49.720 回答