【问题标题】:Regexp for Tokenizing English Text用于标记英文文本的正则表达式
【发布时间】:2011-04-11 20:38:43
【问题描述】:

标记英文文本的最佳正则表达式是什么?

通过英语标记,我的意思是由最大数量的字符组成的原子,可以有意义地用于 NLP 目的。类比是任何编程语言中的“标记”(例如,在 C 中,'{'、'['、'hello'、'&' 等都可以是标记)。有一个限制:虽然英文标点字符可以是“有意义的”,但为了简单起见,我们忽略它们,因为它们没有出现在 \w+ 的中间。所以,“你好,世界。”产生“你好”和“世界”;同样的,“你长得好看。”可能会产生 [you, are, goodlooking] 或 [you, are, good,looking]。

【问题讨论】:

  • 请参阅this question,了解使用 Roost.Regex 在 C++ 中进行标记。
  • @OTZ in English 如果不是一个词,什么是标记?
  • @OTZ:C 有一个正式的规范。英语没有这样的规范。 必须提供你想要的规格。我们猜不出你在想什么。
  • 您需要更具体地了解您想要考虑的令牌。空格应该是标记吗?标点符号?您可以使用正则表达式执行的操作有一些限制(例如,区分用作撇号和单引号的 ')。

标签: regex text nlp


【解决方案1】:

树库标记化

Penn Treebank (PTB) tokenization 是一种用于自然语言处理 (NLP) 工作的相当常见的标记化方案。

您可以找到带有适当正则表达式的 sed 脚本来获取此标记化here

软件包

但是,大多数 NLP 包都提供了现成的标记器,因此您实际上不需要编写自己的标记器。例如,如果您使用的是 python,您可以使用NLTK 提供的TreebankWordTokenizer。如果您使用基于 Java 的 Stanford Parser,默认情况下,它会使用 edu.stanford.nlp.processor.PTBTokenizer 标记您给它的任何句子。

【讨论】:

  • 感谢您为我们提供指向 PTB 标记化方法的指针。虽然他们没有列举连字符和破折号上的那些“微妙之处”,而且我不确定“不会 --> 不会”或“会 --> 会不会”是否合适,但它可以成为首发。 +1
  • This link 现在好像坏了。
【解决方案2】:

您可能不应该尝试使用正则表达式来标记英文文本。在英语中,有些标记有几种不同的含义,只有通过理解它们所在的上下文才能知道哪个是正确的,这需要在一定程度上理解文本的含义。例子:

  • 字符' 可以是撇号,也可以用作单引号来引用某些文本。
  • 句点可以是句子的结尾,也可以表示缩写。或者在某些情况下,它可以同时履行这两个角色。

尝试使用自然语言解析器。例如,您可以使用Stanford Parser。它是免费使用的,并且在标记英文文本方面会比任何正则表达式做得更好。但这只是一个示例 - 您还可以使用许多其他 NLP 库。

【讨论】:

  • 标记化 != 解析。他说的是词法分析(除非我猜错了)。
  • @Nathan 你说得对。 Byers 指的是一个标记器,这不是我的重点。
  • @Paul Nathan:您不能准确地使用正则表达式标记英文文本。如果您只希望它在某些时候工作并且不关心错误,那么您可能可以使用简单的正则表达式来逃避。如果你想让它在大部分时间工作,那么你需要更强大的东西。您可以继续扩展正则表达式以涵盖越来越多的特殊情况,但鉴于更强大的解决方案已经存在并且是免费的,为什么不从一开始就使用它们呢?
  • 整合的痛苦,一方面。 :-) OP 没有讨论他的目标语料库。如果它是基本分析,则正则表达式将起作用。如果是针对更精确的问题,当然您需要更发达的系统。猜测一下,OP 想要一个基本的技巧,因为专家会更准确地提出问题。 Perl 正则表达式也不是真正的正则表达式,它们是上下文相关的东西。
【解决方案3】:

有一些复杂性。

一个单词会有[A-Za-z0-9\-]。但是,除了单词之外,您可能还有其他一些分隔符!您可以以[(\s] 开头并以[),.-\s?:;!] 结尾

【讨论】:

  • 不。不要这样做。请改用 \b。它匹配单词边界。所以这将匹配一个单词:\b.+?\b
  • \b 如果单词包含非 ASCII 字符将无法正常工作!
  • @Rohan:这不适用于连字符或撇号的单词。此外,这不是完整的 Perl 正则表达式。这是一个正则表达式示例,旨在以非 Perl 语法演示可能性的子集。
【解决方案4】:

您可以在[^\p{L}]+ 上拆分。它将在每个不包含字母的字符组上拆分。


资源:

【讨论】:

  • 那 \p 在做什么?您使用哪种语言的正则表达式库?
猜你喜欢
  • 2022-12-18
  • 1970-01-01
  • 2017-12-07
  • 2015-03-19
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多