Spacy tokenizer добавляет исключение для n't

Я хочу преобразовать n't в not, используя этот код:

doc = nlp(u"this. isn't ad-versere")
special_case = [{ORTH: u"not"}]
nlp.tokenizer.add_special_case(u"n't",specia_case)
print [text.orth_ for text in doc]

Но я получаю результат как:

[u'this', u'.', u'is', u"n't", u'ad', u'-', u'versere']

n't по-прежнему n't

Как решить проблему?


person LCP    schedule 04.03.2018    source источник
comment
Попробуйте отредактировать свой вопрос - так почти непонятно ..   -  person ventiseis    schedule 04.03.2018


Ответы (1)


Причина, по которой ваша логика не работает, заключается в том, что spaCy использует неразрушающую токенизацию. Это означает, что он всегда будет содержать ссылку на исходный вводимый текст, и вы никогда не потеряете никакой информации.

Исключения и особые случаи токенизатора позволяют определять правила разделения строки текста на последовательность токенов, но не позволяют изменять исходную строку. Значения ORTH маркеров плюс пробел всегда должны соответствовать исходному тексту. Таким образом, токенизатор может разделить "isn't" на ["is", "n't"], но не на ["is", "not"].

Чтобы определить «нормализованную» форму строки, spaCy использует атрибут NORM, доступный как token.norm_. Вы можете увидеть это в источнике исключений токенизатора здесь - норма жетона "n't" это "not". Атрибут NORM также используется как функция в модели, чтобы гарантировать, что токены с одинаковой нормой получат похожие представления (даже если один встречается в обучающих данных чаще, чем другой).

Поэтому, если вас интересует нормализованная форма, вы можете просто использовать вместо этого атрибут norm_:

>>> [t.norm_ for t in doc]
['this', '.', 'is', 'not', 'ad', '-', 'versere']
person Ines Montani    schedule 05.03.2018