8

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

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

3 回答 3

11

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

import qualified Data.Set as S

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

removePunc = filter (`S.notMember` punctuation)

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

注意:这是一种很小的情况,a 的额外开销Set可能会超过集合与列表的渐近收益,因此如果您正在寻找绝对性能,则必须对其进行分析。

于 2012-07-11T02:36:29.097 回答
8

您可以简单地编写代码:

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

或者

removePunc = filter (flip notElem ".?!-;\'\"")
于 2012-07-11T01:30:00.757 回答
4

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

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

或更实用的风格:

filter (\c -> c `notElem` ".?!,") str
于 2012-07-11T01:16:06.500 回答