我正在做很多自然语言处理,但要求有点不寻常。我经常得到类似于词形还原的任务——给定一个词(或只是一段文本),我需要找到一些模式并以某种方式转换这个词。例如,我可能需要纠正拼写错误,例如给定单词“eatin”,我需要将其转换为“eating”。或者我可能需要将单词“ahahaha”、“ahahahaha”等转换为“ahaha”等。
所以我正在寻找一些通用工具,允许为这种情况定义转换规则。规则可能如下所示:
{w}in -> {w}ing
aha(ha)+ -> ahaha
那就是我需要能够在右侧使用从左侧捕获的模式。
我与完全不懂编程的语言学家一起工作,所以理想情况下,这个工具应该使用外部文件和简单的规则语言。
我在 Clojure 中做这个项目,所以理想情况下这个工具应该是一个 JVM 语言(Java、Scala、Clojure)的库,但其他语言或命令行工具也可以。
有几个非常酷的 NLP 项目,包括GATE、Stanford CoreNLP、NLTK等,我并不是所有这些项目的专家,所以我可能会错过我需要的工具。如果是这样,请告诉我。
请注意,我正在使用多种语言并执行非常不同的任务,因此具体语言的具体词形还原器、词干分析器、拼写错误校正器等不符合我的需求——我真的需要更通用的工具。
UPD。看来我需要提供一些我需要的更多细节/示例。
基本上,我需要一个用某种正则表达式(类似于 Java 的String.replaceAll()
)替换文本的函数,但有可能在替换字符串中使用捕获的文本。例如,在现实世界的文本中,人们经常重复字符以强调特定的单词,例如,有人可能会写“This film is sooooo boooring...”。我需要能够仅用单个字符替换这些重复的“oooo”。所以可能会有这样的规则(语法类似于我在本文前面使用的):
{chars1}<char>+{chars2}? -> {chars1}<char>{chars2}
也就是说,替换以某些字符 ( chars1
) 开头、至少 3 个字符并可能以其他字符 ( chars2
) 结尾的单词,但字符串相似,但只有一个 . 这里的关键是我们抓住规则的左侧并在右侧使用它。