在golang中,删除停用词的最快方法是什么?

时间:2015-10-19 14:34:55

标签: go stop-words

我创建了一个go package to remove stopwords,我正在尝试优化它。

根据我的研究,许多语言中的停用词的平均列表包含大约300个单词。

在包的当前版本中,我使用简单的地图来存储停用词列表。然后,我打破原始内容中的单词,并通过添加不在地图中的单词(停用词)重新创建过滤后的内容。

我尝试使用bloom filter,但它并没有提高性能。我认为这是由于两个因素:

  • Bloom过滤器在搜索大型集合时速度很快,但构建成本很高(即使它只构建一次)。因此,当m大约为300时,整体增益很小。
  • 在当前版本中,我使用了地图,如果我记得很清楚,请构建一个哈希映射,以便更快地搜索密钥。

有更快的方法吗?

1 个答案:

答案 0 :(得分:3)

尝试通过将所有候选词与|粘贴在一起并提前编译来构建正则表达式。 RE2正则表达式引擎将大的替换列表转换为有效的trie数据结构以进行匹配。你可以这样做:

reStr := ""

for i, word := range words {
    if i != 0 {
        reStr += `|`
    }
    reStr += `\Q` + word + `\E`
}
re := regexp.MustCompile(reStr)

\Q\E可防止在列表中的任何单词包含正则表达式元字符的情况下出现任何问题,否则无害。