如何在Python中处理缩写?
我有一些句子想要进行分词处理,包括标点符号。但我需要处理缩写,比如“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"]