我有一个序列来对由spacy的标记化形成的标记进行训练。这是编码器和解码器。
输出是来自seq2seq模型的标记流。我想将文本说出来以形成自然文本。
示例:
输入到Seq2Seq:一些文字
Seq2Seq的输出:这不起作用。
spacy中是否有任何API可以反转其tokenizer中规则所做的标记化?
答案 0 :(得分:5)
内部spaCy跟踪一个布尔数组,以判断标记是否有尾随空格。您需要此数组将字符串重新组合在一起。如果您使用的是seq2seq模型,则可以单独预测空格。
James Bradbury(TorchText的作者)向我抱怨这件事。当我在spaCy中设计标记化系统时,他没有考虑seq2seq模型。他开发了revtok来解决他的问题。基本上什么是revtok(如果我理解的话)是在lexeme ID上加两个额外的位:lexeme是否与前面的空格有亲和力,以及它是否与后续空格有亲和力。空格被插入到其词汇具有空间亲和力的令牌之间。
以下是为spaCy Doc找到这些位的代码:
def has_pre_space(token):
if token.i == 0:
return False
if token.nbor(-1).whitespace_:
return True
else:
return False
def has_space(token):
return token.whitespace_
诀窍是,当 当前词位“没有尾随空格”或下一个词汇说“没有前导空格”时,你会删除一个空格。这意味着你可以使用频率统计来判断这两个词位中的哪一个因缺乏空间而“责备”。
詹姆斯的观点是,这种策略为单词预测决策增加了很少的熵。替代方案将使用hello.
或"Hello
等条目扩展词典。他的方法既没有,因为您可以将字符串hello.
编码为(hello, 1, 0), (., 1, 1)
或(hello, 1, 0), (., 0, 1)
。这个选择很简单:我们绝对应该“责备”缺乏空间的时期。