如何在Python中标记化收缩?

时间:2013-01-29 05:20:14

标签: python regex tokenize

我有一些我想要标记的句子,包括标点符号。但我需要处理收缩,以便那些+不像“不能”的词被标记为“ca”和“not”,其中分裂是撇号之前的一个字符,其余的收缩词分裂在撇号如“你”和“它的”变成“你”,“我”,“它”和“的”。这就是我被困住的地方。基本上大致相当于NKTL的TreebankWord Tokenizer的行为: NLTK Word Tokenization Demo

我一直在使用这里提出的解决方案之一,它不像我想要的那样处理收缩:

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

我得到了这个结果:

  

['你好',',','我',''m“,'a','字符串','!','请','不',''t','杀', '我','?','它',''s','他','汽车','。']

正确处理撇号,除非在不应该是“do”和“not”的情况下。任何人都知道如何解决这个问题?

我只能使用标准库,因此在这种情况下NLTK不是一个选项。

3 个答案:

答案 0 :(得分:1)

<强>正则表达式:

\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"]

答案 1 :(得分:0)

尝试:

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

这匹配后跟'后跟更多字符的字符,即使能够与其他模式匹配,也会匹配

答案 2 :(得分:0)

n't

之前抓住\w+(?=n't)\w+
r"'\w+|n't|\w+(?=n't)|\w+|[^\s\w]"