在Haskell中进行简单文本处理的方法是什么?

时间:2012-07-11 01:06:24

标签: haskell nlp

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

removePunc str = [c | c <- str, c /= '.',
                                 c /= '?',
                                 c /= '.',
                                 c /= '!',
                                 c /= '-',
                                 c /= ';',
                                 c /= '\'',
                                 c /= '\"',]

3 个答案:

答案 0 :(得分:11)

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

import qualified Data.Set as S

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

removePunc = filter (`S.notMember` punctuation)

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

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

答案 1 :(得分:8)

您只需编写代码:

removePunc = filter (`notElem` ".?!-;\'\"")

removePunc = filter (flip notElem ".?!-;\'\"")

答案 2 :(得分:4)

您可以将字符分组为String并使用notElem:

[c | c <- str, c `notElem` ".?!,-;"]

或更具功能性的风格:

filter (\c -> c `notElem` ".?!,") str