我有一个有趣的问题,我需要帮助。我目前正在研究我的程序的一个功能,并偶然发现了这个问题
我在印度尼西亚有一个庞大的街道名单(> 100k行),存储在数据库中, 每个街道名称可能包含多个单词。例如:“Sudirman”,“Gatot Subroto”或“Jalan Asia Afrika”都是合法的街道名称
在数据库中有一堆文本(> 1百万行),我将其分成句子。现在,我需要做的功能(确切地说是功能)是测试句子中是否有街道名称或者没有,所以只是一个真/假测试
我试图通过以下步骤来解决它:
一个。将街道名称放入Key,Value Hash
湾将每个句子分成单词
℃。测试单词是否在哈希
中这很快,但不适用于多个单词
我想到的另一个选择是执行这些步骤:
一个。将每个句子分成单词
湾使用LIKE语句查询数据库(例如,SELECT #### FROM street_table WHERE name,如'%word%')
℃。如果查询返回一行,则表示该句子包含街道名称
现在,这个解决方案将是一个非常密集的IO。
所以我的问题是“进行此测试的最有效方法是什么”?不管编程语言如何。我主要在python中这样做,但只要我能掌握概念,任何语言都会这样做
============编辑1 =================
这会是期刊吗?
是的,我将以1分钟的间隔调用此功能/功能。每次调用至少需要100行文本,并根据街道名称数据库进行测试
答案 0 :(得分:2)
一个简单的解决方案是使用first-word-of-street-name => full-street-name(s)创建字典/多图。当您迭代句子中的每个单词时,您将查找潜在的街道名称,并检查您是否匹配(通过查看下一个单词)。
这个算法应该很容易实现,并且应该也能很好地执行。
答案 1 :(得分:1)
使用nlp,您可以确定句子中的专有名词。请参阅以下链接。
http://nlp.stanford.edu/software/lex-parser.shtml
Standford解析器的计算准确。一旦你拥有了专有名词,你就可以决定采用的方法。
答案 2 :(得分:0)
所以你有一份文件,如果它包含你的街道名单,你想要搜索一下吗?
Turbo Boyer-Moore是一个很好的起点。
Here is more information on turbo boyer moore
但是,我坚信,你必须对你的街道名单组织做些什么。应该有一些桶访问它,即你可以轻松过滤街道名称:
这是一个例子: 街道名称:亚太街道
您可以通过以下方式访问您的列表: A(以A开头的所有起点) AS(以AS开头的所有起点)
依旧......
我相信你应该有很多桶,至少26(第一个字母)* 26(第二个字母)
答案 3 :(得分:0)
Aho-Corasick算法可能非常有用。其中一个优点是它的运行时间与您搜索的单词数量无关(只需要搜索文本多长时间)。如果您的街道名称列表没有经常更改,这将特别有用。
http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm