2010-01-24 173 views
3

我正在开发辅助和替代通信(AAC)程序。我目前的目标是存储输入/说出文本的历史记录,并搜索常用短语片段或单词n-gram。我正在使用基于lzw压缩算法的实现,如CodeProject - N-gram and Fast Pattern Extraction Algorithm所述。尽管生成n-gram,但这种方法并不按照需要运行。正则表达式使用正则表达式

比方说,我多次进入“在山上和树林中”。我期望的输出将是整个短语“在山上和树林中”。使用我目前的实现,该短语被分解为三元组,并且在每个重复条目上添加一个词。因此,在第一个入口我得到“过山”。在第二项“过山”等

假设我们有以下文字:

这是一个测试
这是另一个测试
这也是考验
紧急广播系统的测试中断了我最喜欢的歌曲

我的目标是,如果“这是对紧急广播系统的测试”进入下一个我可以让我们e在正则表达式内返回“这是一个测试”和“紧急广播系统的测试”。这是可能通过正则表达式或我走错了路吗?我感谢任何帮助。

+3

正则表达式是错误的工具。 – 2010-01-24 21:26:19

回答

0

从你的用例看来,你不想要固定长度的n-gram匹配,而是一个最长的n-gram匹配序列。刚刚看到你自己的帖子的答案,这证实了;)

0

在python中,你可以使用fuzzywuzzy库通过“同义词”短语或单词的关联列表匹配一组短语到规范/规范化的短语集。诀窍是恰当地分段你的短语(例如,当逗号分开短语以及它们何时加入短语中的相关单词列表时)?

下面是RAM中python字典的结构。在C本数据结构或数据库将是类似的:

phrase_dict = { 
    'alternative phrase': 'canonical phrase', 
    'alternative two': 'canonical phrase', 
    'less common phrasing': 'different canonical phrase', 
    } 

from fuzzywuzzy.process import extractOne 

phrase_dict[extractOne('unknown phrase', phrase_dict)[0]] 

,并返回

'canonical phrase' 

FuzzyWuzzy似乎使用类似的简化的Levenshtein编辑距离......这是快,但不处理好大写字母(首先对你的情况进行标准化处理),单词声音(还有其他库,如soundex,它们可以用他们听起来像是散列的短语)或单词含义(这就是你的短语词典的用途)。