2015-10-19 115 views
0

我创建了一个去package to remove stopwords,我试图优化它。在golang中,删除停用词的最快方法是什么?

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

在当前版本的包中,我使用一个简单的地图来存储停用词表。然后,我将原始内容中的单词分开,并通过添加不在地图中(停用词)的单词重新创建过滤的内容。我试过使用bloom filter,但它不能改善性能。我认为这是由于两个因素:

  • 布隆过滤器是快速,当涉及到搜索到一个大组,但他们花费了很多建(即使它是建立一次)。所以总体收益很小,其中m大约是300.
  • 在当前版本中,我使用了地图,如果我记得很清楚,去建立一个快速搜索键的散列表。

有没有更快的方法?

+1

当你分析你的程序时,你的瓶颈是什么? – JimB

+0

测试它是否为停用词的行......如果_,ok:= dict [w];好吧{或if filter.Test([] byte(w)){ –

回答

3

尝试通过将所有候选单词粘贴到|并提前编译它来构建正则表达式。 RE2正则表达式引擎会将大的变化列表转换为高效的trie数据结构进行匹配。你可以不喜欢它:

reStr := "" 

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

(在\Q\E防止任何在列表中的字包含正则表达式元字符,并且是无害的,否则不可能情况下,任何问题)。

+0

谢谢。确切的表达式应该是类似var filter = regexp.MustCompile('\ A(a | along | another | yet)\ z'),尽管你想做别的事情而不是匹配?通过匹配,速度提高了60%。 –

+0

@BenjaminBALET我建议不要使用单词分隔符并试图匹配单个单词 - 相反,匹配整个输入字符串的停用词正则表达式。这样,正则表达式引擎可以有效地跳过大量的非匹配单词。如果'ReplaceAllFunc'功能不够强大,那么'FindStringIndex'应该可以帮助你完成这项工作。 – hobbs

相关问题