在Haskell中进行简单文本处理有什么用途?

tur*_*tle 8 haskell nlp

我想在Haskell中做一些简单的文本处理,我想知道在FP语言中我最好的方法是什么.我查看了parsec模块,但这看起来比我作为一个新的Haskeller要复杂得多.从文本语料库中删除所有标点符号的最佳方法是什么?我天真的做法是制作这样的函数:

removePunc str = [c | c <- str, c /= '.',
                                 c /= '?',
                                 c /= '.',
                                 c /= '!',
                                 c /= '-',
                                 c /= ';',
                                 c /= '\'',
                                 c /= '\"',]
Run Code Online (Sandbox Code Playgroud)

huo*_*uon 11

一个可能更有效的方法(O(log n)而不是O(n)),是使用a Set(来自Data.Set):

import qualified Data.Set as S

punctuation = S.fromList ",?,-;'\""

removePunc = filter (`S.notMember` punctuation)
Run Code Online (Sandbox Code Playgroud)

您必须在函数外部构造集合,以便它只计算一次(通过在所有调用之间共享),因为创建集合的开销远大于notElem其他人建议的简单线性时间测试.

注意:这是一个很小的情况,一个额外的开销Set可能会超过集合与列表的渐近优势,所以如果一个人正在寻找绝对性能,那么必须对其进行分析.


Ron*_*son 8

你可以简单地编写你的代码:

removePunc = filter (`notElem` ".?!-;\'\"")
Run Code Online (Sandbox Code Playgroud)

要么

removePunc = filter (flip notElem ".?!-;\'\"")
Run Code Online (Sandbox Code Playgroud)