改进单词匹配(向前看?)算法性能

时间:2012-03-27 23:01:02

标签: algorithm parsing

我正在尝试在http://mandarinspot.com/annotate重现文本注释的功能,我有一个解决方案,但我的努力在速度方面有所下降。我确实看过字符串搜索算法,每个应用程序的技术都各不相同,所以我在这里寻找一些指示。

此页面包含大量中文并在顶部添加拼音发音,以及定义工具提示。我想重现这个页面的原因是:1。我喜欢使用一个名为Gwoyeu Romatzyh的不同语音系统,以及2.重新学习编程。

我会尝试描述我正在做的事情,用英语取代基础的中文。让我们说对于给定的字符串,“加里吃葡萄和葡萄柚”,程序必须输出每个单词的定义,如“[专名] [摄取食物] [水果生长成簇] [大柑橘类水果]” 。现在,由于'葡萄'和'葡萄柚'开始相同,程序需要区分它们(在中文中,没有空格,所以拆分字符串不是一个选项,所以我真的要解析“Garyateagrapeandagrapefruit”并且有解析“葡萄柚”时它“向前看”。

我的数据结构是树结构,其中每个节点包含单个中文字符和父ID。如果该字符是短语的一部分,则父母会告诉我该短语的前一个字符是什么。

示例:如果“ABC”是中文单词,则A的ID可以为1,没有父ID,B:ID = 2且parent = 1,C:ID = 3,parent = 2。对于“ABD”,D将具有ID = 4并且父= 2(B)。每个节点还有一个'definition'数组,指向一个单独的数组,该数组包含该字符或单词的英文定义。如果节点不是单词的最后一个,则“定义”将为空白。

要解析字符串,

  1. 将当前字符(curChar)及其后面的字符(nextChar)保存为两个变量。
  2. 搜索nextChar与节点字符匹配的节点,此节点将curChar作为父节点。如果这是真的,我认为我有两个或更多字符的长字。如果它是假的,我得出结论,curChar和nextChar之间没有任何关系,并输出我对curChar所做的任何事情。
  3. 感谢您的任何建议!

2 个答案:

答案 0 :(得分:2)

Aho-Corasick in Wikipedia将为您提供一种快速算法,可以在字典中显示字典中的所有单词。鉴于此,你可以选择最长的替代品,就像你一直在做的那样,或者使用动态编程来找到一个路径,通过所找到的单词来说明流中的所有字符。

答案 1 :(得分:1)

只是一个建议 - 如何使用哈希表而不是树?如果你将它与滚动哈希结合使用(如Rabin-Karp字符串搜索算法中使用的哈希),它将提高查找效率,因此哈希计算每个子字符串需要O(1),查找取平均值案例O(1)。