我有一些我想要标记的句子,包括标点符号。但我需要处理收缩,以便那些+不像“不能”的词被标记为“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不是一个选项。
答案 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]"