Сохранение всех пробелов в качестве токенов - PullRequest
0 голосов
/ 06 июня 2018

У меня есть вопрос о том, есть ли способ сохранить один пробел в качестве независимого токена в токенизации 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', '.']
* 1011Есть ли простой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Если вы хотите использовать пробелы в объекте 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])
0 голосов
/ 06 июня 2018

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 объекты могут быть построены с аргументом ключевого слова words (список строк, добавляемых в качестве токенов).Однако я не уверен, насколько это было бы полезно.

...