我有一个巨大列表的人名,我必须在巨大的文本中搜索。
只有部分名称可能会出现在文本中。并且可能拼写错误,错误输入或 abreviated 。文本没有令牌,因此我不知道文本中人名的起源。如果知道名称是否会在文本中出现,我也不知道。
示例:
我的列表中有“Barack Hussein Obama”,所以我必须在以下文本中检查该名称的出现次数:
Certanily没有确定性的解决方案,但是......
这种搜索有什么好的启发式方法?
如果必须,你会怎么做?
答案 0 :(得分:6)
你说这是大约200页。
将其分为200页的单页PDF。
将每页都放在Mechanical Turk上,同时列出名称。提供每页约5美元的奖励。
答案 1 :(得分:5)
答案 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 Server和Oracle都有内置的SOUNDEX函数。
此外,还有一个名为DIFFERENCE的SQL Server内置函数可供使用。
答案 7 :(得分:-1)
纯旧的正则表达式脚本将完成这项工作。
使用Ruby,它非常快。读取行和匹配单词。
欢呼