n-gram使用正则表达式

时间:2010-01-24 21:20:14

标签: c# regex

我正在开展一项补充和替代通信(AAC)计划。我目前的目标是存储输入/口语文本的历史记录并搜索常用短语片段或单词n-gram。我目前正在使用基于CodeProject - N-gram and Fast Pattern Extraction Algorithm讨论的lzw压缩算法的实现。虽然产生n-gram,但这种方法并不像所需的那样。

比方说,我可以多次进入“越过山脉,越过树林”。我想要的输出将是“越过山脉和树林”的整个短语。使用我当前的实现,该短语被分为三元组,并且在每个重复的条目中添加一个单词。所以在第一个条目我得到“越过山”。在第二个条目“过山和”等。

我们假设我们有以下文字:

  

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

我的目标是,如果接下来输入“这是对紧急广播系统的测试”,我可以在正则表达式中使用它来返回“这是一个测试”和“紧急广播系统的测试”。这是通过正则表达式可能的事情还是我走错了路?我感谢任何帮助。

3 个答案:

答案 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,可以通过它们听起来像或者单词含义来散列短语(这就是你的短语词典的用途)。