我正在开展一项补充和替代通信(AAC)计划。我目前的目标是存储输入/口语文本的历史记录并搜索常用短语片段或单词n-gram。我目前正在使用基于CodeProject - N-gram and Fast Pattern Extraction Algorithm讨论的lzw压缩算法的实现。虽然产生n-gram,但这种方法并不像所需的那样。
比方说,我可以多次进入“越过山脉,越过树林”。我想要的输出将是“越过山脉和树林”的整个短语。使用我当前的实现,该短语被分为三元组,并且在每个重复的条目中添加一个单词。所以在第一个条目我得到“越过山”。在第二个条目“过山和”等。
我们假设我们有以下文字:
这是一个测试 这是另一个测试 这也是一个测试 紧急广播系统的测试打断了我最喜欢的歌曲
我的目标是,如果接下来输入“这是对紧急广播系统的测试”,我可以在正则表达式中使用它来返回“这是一个测试”和“紧急广播系统的测试”。这是通过正则表达式可能的事情还是我走错了路?我感谢任何帮助。
答案 0 :(得分:1)
尽管Matching parts of a string when the string contains part of a regex pattern显示的技术很接近,但我一直无法找到单纯正则表达式所需的方法。
我最终使用了我的初始系统和一些正则表达式的组合,如下所示。
flow chart http://www.alsmatters.org/files/phraseextractor.png
这会在大约30秒内解析第一次总统辩论的记录(大约16,500个单词),这对我来说非常快。
答案 1 :(得分:0)
从您的用例看,您似乎不需要固定长度的n-gram匹配,而是需要最长的n-gram匹配序列。刚看到你对自己帖子的回答,确认了;)
答案 2 :(得分:0)
在python中,您可以使用fuzzywuzzy库通过相关的“同义词”短语或单词列表将一组短语与规范/规范化的短语集匹配。诀窍是适当地分割你的短语(例如,当逗号分开短语时,他们何时加入短语中的相关单词列表?)
这是RAM中python dict的结构。您在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,可以通过它们听起来像或者单词含义来散列短语(这就是你的短语词典的用途)。