如何在文本中搜索某人的姓名? (启发式)

时间:2008-12-03 21:00:30

标签: language-agnostic search heuristics

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

只有部分名称可能会出现在文本中。并且可能拼写错误错误输入 abreviated 。文本没有令牌,因此我不知道文本中人名的起源。如果知道名称​​是否会在文本中出现,我也不知道。

示例:

我的列表中有“Barack Hussein Obama”,所以我必须在以下文本中检查该名称的出现次数:

  • ......候选人 Barack Obama 当选为美国总统......(不完整)
  • ......候选人 Barack Hussein 当选为美国总统......(不完整)
  • ......候选人 Barack H. O。当选为美国总统......(简称)
  • ......候选人 Barack ObaNa 当选为美国总统......(拼写错误)
  • ......候选人 Barack OVama 当选为美国总统......(错误排列,B排在V旁边)
  • ......候选人 John McCain 输掉了选举......(没有出现奥巴马的名字)

Certanily没有确定性的解决方案,但是......

这种搜索有什么好的启发式方法?

如果必须,你会怎么做?

8 个答案:

答案 0 :(得分:6)

你说这是大约200页。

将其分为200页的单页PDF。

将每页都放在Mechanical Turk上,同时列出名称。提供每页约5美元的奖励。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

您想要的是Natural Lanuage Processing库。您正在尝试识别专有名词的子集。如果名字是专有名词的主要来源,那么如果有相当数量的其他专有名词混合在一起比较容易,那就更难了。如果您正在使用JAVA编写,请查看OpenNLP或C#SharpNLP。提取所有专有名词后,您可以使用Wordnet删除大多数非名称专有名词。您可以使用wordnet来识别名称的子部分,如“John”,然后搜索相邻的令牌以吸取名称的其他部分。你会遇到像“约翰史密斯工业”这样的问题。您必须查看基础数据,看看是否有可以利用的功能来帮助缩小问题范围。

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

答案 3 :(得分:1)

乍一看,我要去索引服务器。 lucene,FAST或Microsoft Indexing Server。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

我个人会在使用某些编程生成排列列表时使用正则表达式。

答案 6 :(得分:0)

SQL ServerOracle都有内置的SOUNDEX函数。

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

答案 7 :(得分:-1)

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

使用Ruby,它非常快。读取行和匹配单词。

欢呼