鉴于一组庞大的街道名称,测试文本是否包含集合中的街道名称的最有效方法是什么?

时间:2012-06-11 11:45:42

标签: algorithm nlp

我有一个有趣的问题,我需要帮助。我目前正在研究我的程序的一个功能,并偶然发现了这个问题

  1. 我在印度尼西亚有一个庞大的街道名单(> 100k行),存储在数据库中, 每个街道名称可能包含多个单词。例如:“Sudirman”,“Gatot Subroto”或“Jalan Asia Afrika”都是合法的街道名称

  2. 在数据库中有一堆文本(> 1百万行),我将其分成句子。现在,我需要做的功能(确切地说是功能)是测试句子中是否有街道名称或者没有,所以只是一个真/假测试

    我试图通过以下步骤来解决它:

  3. 一个。将街道名称放入Key,Value Hash

    湾将每个句子分成单词

    ℃。测试单词是否在哈希

    这很快,但不适用于多个单词

    我想到的另一个选择是执行这些步骤:

    一个。将每个句子分成单词

    湾使用LIKE语句查询数据库(例如,SELECT #### FROM street_table WHERE name,如'%word%')

    ℃。如果查询返回一行,则表示该句子包含街道名称

    现在,这个解决方案将是一个非常密集的IO。

    所以我的问题是“进行此测试的最有效方法是什么”?不管编程语言如何。我主要在python中这样做,但只要我能掌握概念,任何语言都会这样做

    ============编辑1 =================

    这会是期刊吗?

    是的,我将以1分钟的间隔调用此功能/功能。每次调用至少需要100行文本,并根据街道名称数据库进行测试

4 个答案:

答案 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(第二个字母)

more information about bucketing

答案 3 :(得分:0)

Aho-Corasick算法可能非常有用。其中一个优点是它的运行时间与您搜索的单词数量无关(只需要搜索文本多长时间)。如果您的街道名称列表没有经常更改,这将特别有用。

http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm