Python的Spacy包有一个统计标记器,可以智能地将一个句子分成标记。我的问题是,是否有一个包允许我倒退,即从令牌列表到一个格式很好的句子?基本上,我想要一个允许我执行以下操作的功能:
>>> toks = ['hello', ',', 'i', 'ca', "n't", 'feel', 'my', 'feet', '!']
>>> some_function(toks)
"Hello, I can't feel my feet!"
可能需要某种基于统计/规则的程序来了解间距,大小写或收缩应如何在适当的句子中起作用。
答案 0 :(得分:9)
在spaCy中,您始终可以使用''.join(token.text_with_ws for token in doc)
重建原始字符串。如果你拥有的只是一个字符串列表,那么它并不是一个很好的确定性解决方案。您可以训练反向模型或使用一些近似规则。我不知道这个detokenize()
函数的良好通用实现。
答案 1 :(得分:4)
您可以在某种程度上使用nltk
进行这样的去除声明。您需要进行一些后期处理或修改正则表达式,但这里有一个示例:
import re
from nltk.tokenize.treebank import TreebankWordDetokenizer as Detok
detokenizer = Detok()
text = detokenizer.detokenize(tokens)
text = re.sub('\s*,\s*', ', ', text)
text = re.sub('\s*\.\s*', '. ', text)
text = re.sub('\s*\?\s*', '? ', text)
还有更多边缘情况带有标点符号,但这非常简单,略好于' '.join