Пространственный токенизация объединяет неправильные токены - PullRequest
0 голосов
/ 25 января 2019

Я хотел бы использовать spacy для токенизации соскобов из Википедии. В идеале это будет работать так:

text = 'procedure that arbitrates competing models or hypotheses.[2][3] Researchers also use experimentation to test existing theories or new hypotheses to support or disprove them.[3][4]'

# run spacy
spacy_en = spacy.load("en")
doc = spacy_en(text, disable=['tagger', 'ner'])
tokens = [tok.text.lower() for tok in doc]

# desired output
# tokens = [..., 'models', 'or', 'hypotheses', '.', '[2][3]', 'Researchers', ...

# actual output
# tokens = [..., 'models', 'or', 'hypotheses.[2][3', ']', 'Researchers', ...]

Проблема в том, что «гипотезы. [2] [3]» склеены в один токен.

Как я могу запретить spacy подключить этот '[2] [3]' к предыдущему токену? Пока оно отделено от слова гипотезы и точки в конце предложения, мне все равно, как оно обрабатывается. Но отдельные слова и грамматика должны оставаться в стороне от синтаксического шума.

Так, например, любое из следующего было бы желательным выводом:

  • 'hypotheses', '.', '[2][', '3]'
  • hypotheses', '.', '[2', '][3]'

1 Ответ

0 голосов
/ 25 января 2019

Я думаю, вы можете попробовать поиграть с инфиксом:

import re
import spacy
from spacy.tokenizer import Tokenizer

infix_re = re.compile(r'''[.]''')

def custom_tokenizer(nlp):
  return Tokenizer(nlp.vocab, infix_finditer=infix_re.finditer)

nlp = spacy.load('en')
nlp.tokenizer = custom_tokenizer(nlp)
doc = nlp(u"hello-world! I am hypothesis.[2][3]")
print([t.text for t in doc])

Подробнее об этом https://spacy.io/usage/linguistic-features#native-tokenizers

...