我创建了一个 go包来删除停用词,我正在尝试优化它。根据我的研究,许多语言的停用词列表平均包含大约 300 个单词。在包的当前版本中,我使用了一个简单的映射来存储停用词列表。然后,我打破原始内容中的单词并通过添加不在地图(停用词)中的单词重新创建过滤内容。我尝试使用布隆过滤器,但它并没有提高性能。我认为这是由于两个因素:布隆过滤器在搜索大型集合时速度很快,但构建成本很高(即使构建一次)。因此,当 m 约为 300 时,整体增益很小。在当前版本中,我使用了映射,如果我没记错的话,go 会构建一个哈希映射来更快地搜索密钥。有没有更快的方法?
1 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
尝试通过将所有候选词粘贴在一起|并提前编译来构建正则表达式。RE2 正则表达式引擎会将大的交替列表转换为高效的特里数据结构以进行匹配。你可以这样做:
reStr := ""
for i, word := range words {
if i != 0 {
reStr += `|`
}
reStr += `\Q` + word + `\E`
}
re := regexp.MustCompile(reStr)
(中\Q和\E防止在偶然的情况下,任何在列表中的单词包含正则表达式元字符,并且是无害的,否则任何问题)。
- 1 回答
- 0 关注
- 419 浏览
添加回答
举报
0/150
提交
取消