如何在Python中处理缩写?

2 投票
3 回答
3939 浏览
提问于 2025-04-17 14:00

我有一些句子想要进行分词处理,包括标点符号。但我需要处理缩写,比如“can't”这样的词要分成“ca”和“n't”,也就是在撇号前面切分一个字符。其他的缩写词,比如“you've”和“It's”,要分成“you”、“'ve”和“It”、“'s”。我在这方面遇到了困难。基本上,我想要的效果和NKTL的TreebankWord Tokenizer差不多:NLTK词语分词演示

我一直在使用这里提到的一个解决方案,但它处理缩写的方式并不是我想要的:

re.findall("'\w+|[\w]+|[^\s\w]", "Hello, I'm a string! Please don't kill me? It's his car.")

结果是这样的:

['Hello', ',', 'I', "'m", 'a', 'string', '!', 'Please', 'don', "'t", 'kill', 'me', '?', 'It', "'s", 'his', 'car', '.']

这个方法处理撇号是正确的,但在“don't”的情况下,它应该分成“do”和“n't”。有没有人知道怎么解决这个问题?

我只能使用标准库,所以在这种情况下不能使用NLTK。

3 个回答

0

在这里,我们要抓取那些包含“n't”的单词,以及在“n't”之前的单词。具体来说,我们使用的正则表达式是 \w+(?=n't),它的意思是找到一个单词,后面紧跟着“n't”。

r"'\w+|n't|\w+(?=n't)|\w+|[^\s\w]"
0

试试这个:

r"[n]'[\w]+|[\w]+(?!')(?:[A-Za-mo-z](?='))?|(?<=\s)[\w](?=')|[^\s\w']"

这个表达式会匹配一个字符,后面跟着一个',再后面是更多的字符。即使它也能匹配其他的模式,它会优先匹配第一个

1

正则表达式(Regex):

\w+(?=n't)|n't|\w+(?=')|'\w+|\w+

用法

match_list = re.findall(r"\w+(?=n't)|n't|\w+(?=')|'\w+|\w+","you've it's couldn't don't", re.IGNORECASE | re.DOTALL)

匹配项:

['you', "'ve", "it", "'s", 'could', "n't", "do", "n't"]

撰写回答