在golang中,去除停用词最快的方法是什么?
In golang, what is the fastest way to remove stop words?
我创建了一个 go package to remove stopwords,我正在尝试优化它。
根据我的研究,许多语言的停用词列表平均包含大约 300 个词。
在当前版本的包中,我使用了一个简单的地图来存储停用词列表。然后,我打破原始内容中的单词并通过添加不在地图(停用词)中的单词来重新创建过滤后的内容。
我试过使用 bloom filter,但它并没有提高性能。我认为这是由于两个因素:
- 布隆过滤器在搜索大型集合时速度很快,但构建成本很高(即使构建一次)。因此,当 m 约为 300 时,整体收益很小。
- 在当前版本中,我使用了 maps,如果我没记错的话,go 构建了一个 hashmap 以更快地搜索密钥。
有没有更快的方法?
尝试通过将所有候选词与 |
粘贴在一起并提前编译来构建正则表达式。 RE2 正则表达式引擎会将大列表转换为高效的 trie 数据结构以进行匹配。你可以这样做:
reStr := ""
for i, word := range words {
if i != 0 {
reStr += `|`
}
reStr += `\Q` + word + `\E`
}
re := regexp.MustCompile(reStr)
(\Q
和 \E
可以防止在列表中的任何单词包含正则表达式元字符这种不太可能发生的情况下出现任何问题,否则是无害的)。
我创建了一个 go package to remove stopwords,我正在尝试优化它。
根据我的研究,许多语言的停用词列表平均包含大约 300 个词。
在当前版本的包中,我使用了一个简单的地图来存储停用词列表。然后,我打破原始内容中的单词并通过添加不在地图(停用词)中的单词来重新创建过滤后的内容。
我试过使用 bloom filter,但它并没有提高性能。我认为这是由于两个因素:
- 布隆过滤器在搜索大型集合时速度很快,但构建成本很高(即使构建一次)。因此,当 m 约为 300 时,整体收益很小。
- 在当前版本中,我使用了 maps,如果我没记错的话,go 构建了一个 hashmap 以更快地搜索密钥。
有没有更快的方法?
尝试通过将所有候选词与 |
粘贴在一起并提前编译来构建正则表达式。 RE2 正则表达式引擎会将大列表转换为高效的 trie 数据结构以进行匹配。你可以这样做:
reStr := ""
for i, word := range words {
if i != 0 {
reStr += `|`
}
reStr += `\Q` + word + `\E`
}
re := regexp.MustCompile(reStr)
(\Q
和 \E
可以防止在列表中的任何单词包含正则表达式元字符这种不太可能发生的情况下出现任何问题,否则是无害的)。