将所有白色空间保持为令牌

时间:2018-06-06 11:50:50

标签: python spacy

我有一个问题是,是否有办法将单个空格作为spaCy标记化中的独立标记。

例如,如果我跑:

import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("This is easy.")
toks = [w.text for w in doc]
toks

结果是

['This', 'is', 'easy', '.']

相反,我希望有像

这样的东西
['This', ' ', 'is', ' ', 'easy', '.']

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:4)

spaCy将令牌的空格公开为whitespace_属性。因此,如果您只需要一个字符串列表,您可以这样做:

token_texts = []
for token in doc:
   token_texts.append(token.text)
   if token.whitespace_:  # filter out empty strings
       token_texts.append(token.whitespace_)

如果您想从这些令牌中创建一个实际的Doc对象,那也是可能的。 Doc个对象可以是constructed,并带有words关键字参数(要添加为标记的字符串列表)。但是,我不确定它会有多大用处。

答案 1 :(得分:2)

如果您想要doc对象中的空格:

import spacy
from spacy.tokens import Doc

class WhitespaceTokenizer(object):
    def __init__(self, vocab):
        self.vocab = vocab

    def __call__(self, text):
        words = text.split(' ')
        res = [' '] * (2 * len(words) - 1)
        res[::2] = words
        return Doc(self.vocab, words=res)

nlp = spacy.load('en_core_web_sm')
nlp.tokenizer = WhitespaceTokenizer(nlp.vocab)
doc = nlp("This is easy.")
print([t.text for t in doc])