正则表达式模式在去掉结束标点符号的同时标记句子



我需要制作一个正则表达式模式,它可以标记一个句子,也可以单独标记标点符号,除了缩写、缩写和连字符。

"This is a test sentence. I won't write this sentence. J. Smith lives in the U.S.A. and it is nice there."

应作为返回

["This" "is" "a" "test" "sentence" "." "I" "won't" "write" "this" "sentence" "." "J." "Smith" "lives" 
"in" "the" "U.S.A." "and" "it" "is" "nice" "there" ."]

我目前的代码是:

tokens = re.findall(r'((.s)|(S+))', sentence)

但这并不正确。它匹配单词末尾的句点作为单词的一部分。

您可以使用[^s.]{2,}|(?:w|.)+来标记这个特定的示例,但正如Ryan所提到的,如果没有自然语言工具包,这是徒劳的。

此正则表达式允许匹配两种情况:

  1. [^s.]{2,}匹配2个或多个连续的非空格、非文字句点字符
  2. (?:w|.)+匹配一个或多个连续的单词字符或文字周期

用法:

import re
s = """This is a test sentence. 
I won't write this sentence. J. Smith lives in the U.S.A.  and it is nice there.
"""
for token in re.findall(r"[^s.]{2,}|(?:w|.)+", s):
print(repr(token))

输出:

'This'
'is'
'a'
'test'
'sentence'
'.'
'I'
"won't"
'write'
'this'
'sentence'
'.'
'J.'
'Smith'
'lives'
'in'
'the'
'U.S.A.'
'and'
'it'
'is'
'nice'
'there'
'.'

这在regex中是不可能的。无法区分要将标点符号作为标记的一部分的包含标点符号的单词(在您的示例中为"J.",或者"Jr."不是一个字符(与要将标点作为自己的标记的后面跟着标点符号的词(在您中为"句子."(。

您需要一个自然语言解析库来实现这一点,正如您所描述的问题一样。

也许可以设计一些启发式方法,比如单词的长度,后面是一个大写字母的单词,还是违反规则的白名单常见单词,但要使这项工作稳健进行,你会遇到问题。

这里有一个适用于您所拥有的内容,可以用于类似的句子。同样,如果有不同的变体,则不能总是使用。

([A-Z].S*|w+'*w*|[A-Z].|.)

最新更新