用于将英文文本分词的正则表达式

8
什么是用于标记英文文本的最佳正则表达式?
通过英文标记,我指的是由最多数量的字符组成的基元,可用于NLP目的。类比于任何编程语言中的“token”(例如,在C语言中,“{”,“[”,“hello”,“&”等都可以作为token)。有一个限制:尽管英文标点符号可能是“有意义”的,但让我们为了简单起见在它们没有出现在\w+的中间时忽略它们。因此,“Hello, world.”将产生'hello'和'world'; 同样,“You are good-looking.”可能会产生[you,are,good-looking]或[you,are,good,looking]。

1
可能是[True definition of an English word?]的重复问题。(https://dev59.com/WVDTa4cB1Zd3GeqPI2dK) - Daniel Vandersluis
如果不是一个单词,@OTZ在英语中什么是令牌? - Daniel Vandersluis
2
@OTZ:C语言有正式的规范,而英语没有这样的规范。必须提供你想要的规范,我们无法猜测你在想什么。 - Mark Byers
@Vandersluis 但是你知道它们之间的区别吧?一个英语单词不是一些base64字符串,而一个英语标记可以是任何\w+和更多。 - OTZ
3
你需要更具体地定义什么是"token",是否包括空格或标点符号。请注意,正则表达式有其局限性(例如区分撇号和单引号的用法)。 - Adrian McCarthy
显示剩余10条评论
4个回答

5

树库分词

Penn Treebank (PTB) tokenization是一种常用的自然语言处理(NLP)分词方案。

你可以在这里找到一个带有适当正则表达式的sed脚本来获取此分词方案。

软件包

然而,大多数NLP包都提供了现成的分词器,因此您实际上不需要编写自己的分词器。例如,如果您正在使用Python,则可以直接使用NLTK提供的TreebankWordTokenizer。如果您正在使用基于Java的Stanford Parser,它将默认使用其edu.stanford.nlp.processor.PTBTokenizer对给定的任何句子进行分词。


感谢您为我们提供PTB分词方法的指针。虽然他们没有列举连字符和破折号之间的那些“微妙差别”,而且我也不确定“won't-->wo n't”或“gonna-->gon na”是否合适,但这可以作为一个起点。+1 - OTZ
这个链接现在似乎已经失效了。 - Anderson Green

2
您可能不应该尝试使用正则表达式来对英文文本进行分词。在英语中,有些单词可能有几种不同的含义,而你只有通过理解它们所处的上下文才能确定正确的含义,并且这需要在一定程度上理解文本的含义。例如:
  • 字符“ ' ”可以是撇号,也可以用作单引号来引用某些文本。
  • 句号可能表示一个句子的结尾,也可能表示缩略语,或者在某些情况下同时发挥这两个角色。
请尝试使用自然语言解析器,例如斯坦福解析器。它是免费使用的,比任何正则表达式更能有效地对英文文本进行分词。这只是其中的一个例子 - 还有许多其他的自然语言处理库可用。

分词不等于解析。他在谈论词法分析(除非我猜错了)。 - Paul Nathan
@Nathan,你说得对。Byers 正在提到一个标注器,这不是我的重点。 - OTZ
1
@Paul Nathan:使用正则表达式无法准确地对英文文本进行分词。如果你只想让它有时候工作并且不关心错误,那么你可能可以使用简单的正则表达式。如果你希望它大部分时间都能工作,那么你需要更强大的工具。你可以不断扩展正则表达式以涵盖越来越多的特殊情况,但既然已经存在更强大且免费的解决方案,为什么不从一开始就使用它们呢? - Mark Byers
整合的痛苦,是其中一个问题。 :-) OP 没有讨论他的目标语料库。如果它是基本分析,正则表达式就可以解决。如果是针对更精确的问题,当然你需要一个更完善的系统。猜测一下,OP 想要一个基本的 hack,因为专家会更准确地提出问题。此外,Perl 正则表达式并不是真正的正则表达式,它们是上下文敏感的某些东西。 - Paul Nathan

1

那个 \p 是干什么用的?你在使用哪种语言的正则表达式库? - OTZ

0

这里涉及到一些复杂性。

一个单词可能包含 [A-Za-z0-9\-]。但是,除了单词本身之外,你可能还有其他的分隔符!你可以以 [(\s] 开始,并以 [),.-\s?:;!] 结束。


不要这样做。使用\b代替。它匹配单词边界。因此,这将匹配一个单词:\b.+?\b - Rohan Singh
如果单词包含非ASCII字符,\b将无法正常工作! - Daniel Vandersluis
@Rohan:对于连字符单词或带撇号的单词,那样做是行不通的。此外,这不是完整的Perl正则表达式。这是一个示例正则表达式,旨在以非Perl语法演示可能性的子集。 - Paul Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接