Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 如何搜索一个人';文本中有谁的名字?(启发式)_Language Agnostic_Search_Heuristics - Fatal编程技术网

Language agnostic 如何搜索一个人';文本中有谁的名字?(启发式)

Language agnostic 如何搜索一个人';文本中有谁的名字?(启发式),language-agnostic,search,heuristics,Language Agnostic,Search,Heuristics,我有一个巨大的名单的人的全名,我必须在一个巨大的文本搜索 文本中只能显示部分名称。而且它也有可能拼写错误、打字错误或删节。文本没有标记,因此我不知道文本中人名的起始位置。我不知道这个名字是否会出现在文本中 例如: 我的列表中有“巴拉克·侯赛因·奥巴马”,因此我必须检查以下文本中是否出现该名字: …候选人巴拉克·奥巴马当选为美国总统。。。(不完整) 候选人巴拉克·侯赛因被选为美国总统。。。(不完整) …候选人巴拉克·H·O.当选为美国总统。。。(缩写) …候选人巴拉克·奥巴纳被选为美国总统。。。

我有一个巨大的名单的人的全名,我必须在一个巨大的文本搜索

文本中只能显示部分名称。而且它也有可能拼写错误、打字错误或删节。文本没有标记,因此我不知道文本中人名的起始位置。我不知道这个名字是否会出现在文本中

例如:

我的列表中有“巴拉克·侯赛因·奥巴马”,因此我必须检查以下文本中是否出现该名字:

  • …候选人巴拉克·奥巴马当选为美国总统。。。(不完整)
  • 候选人巴拉克·侯赛因被选为美国总统。。。(不完整)
  • …候选人巴拉克·H·O.当选为美国总统。。。(缩写)
  • …候选人巴拉克·奥巴纳被选为美国总统。。。(拼写错误)
  • …候选人巴拉克·奥瓦马当选为美国总统。。。(输入错误,B在V旁边)
  • …候选人约翰·麦凯恩在选举中输了。。。(没有出现奥巴马的名字)
当然没有一个确定的解决方案,但是

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


如果必须这样做,你会怎么做?

我能想到的最好的方法是用python定义语法。然而,对于你想要的东西,它可能变得相当复杂


我个人喜欢使用正则表达式,同时通过一些编程生成排列列表。

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

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

两者都有,并具有内置的SOUNDEX功能


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

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

使用Ruby,速度相当快。读台词,拼单词


干杯

您需要的是一个自然语言处理库。您试图识别专有名词的子集。如果名称是专有名词的主要来源,那么如果有相当数量的其他专有名词混合在一起,那么就很容易了,这就更难了。如果您是用JAVA编写的,请查看OpenNLP或C#SharpNLP。提取所有专有名词后,您可能可以使用Wordnet删除大多数非名称专有名词。您可以使用wordnet识别名称的子部分,如“John”,然后搜索相邻的标记以吸收名称的其他部分。你会遇到像“约翰·史密斯工业”这样的问题。您必须查看底层数据,看看是否有可以利用的功能来帮助缩小问题范围


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

你说大约有200页

把它分成200份一页的PDF


把每一页都写在Mechanical Turk上,并附上姓名列表。提供每页大约5美元的奖励。

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

我喜欢soundex处理拼写错误的想法。对于庞大的列表,它可能不会运行得很快,但这仍然是一个有趣的想法。如果您使用MSSQL,则有两个sql函数SOUNDEX和DIFFERENCE可供使用。SOUNDEX对非英语语言适用吗?就我而言,是葡萄牙语-BR@Daniel,看这里:创建一个自己的soundex版本并不难,这样你就可以自己做了。检查一下soundex是如何工作的:你能定义“大文本”1012字节、1015字节等等吗?有哪些可用资源(计算机时间、电源)?一份200页以上的PDF文档,小字体。。。。算算吧!$pdftotext file.pdf-| wc--chars$5还是$0.05$1000美元的成本可能会让人望而却步。Joel有很多实习生要养活——那些Aeron座椅是自己付不起的!与编写代码的成本相比,1000美元似乎很划算。但我怀疑你可能会让机械土耳其人花大约0.5美元在网页上搜索名字。。。。试试一两个,应该很容易!