Как я могу предотвратить разбиение токенизатором spacy определенной подстроки при токенизации строки?

Как я могу предотвратить разбиение токенизатором spacy определенной подстроки при токенизации строки?

В частности, у меня есть это предложение:

После отмены регистрации папка ушла из оболочки.

который токенизируется как [Once / unregistered /, / the / folder / go / away / from / the / she / ll /.] scapy 1.6.0. Я не хочу, чтобы подстрока shell была разделена на два разных токена she и ll.


Вот код, который я использую:

# To install spacy:
# sudo pip install spacy
# sudo python -m spacy.en.download parser # will take 0.5 GB

import spacy
nlp = spacy.load('en')

# https://spacy.io/docs/usage/processing-text
document = nlp(u'Once unregistered, the folder went away from the shell.')

for token in document:
    print('token.i: {2}\ttoken.idx: {0}\ttoken.pos: {3:10}token.text: {1}'.
      format(token.idx, token.text,token.i,token.pos_))

который выводит:

token.i: 0      token.idx: 0    token.pos: ADV       token.text: Once
token.i: 1      token.idx: 5    token.pos: ADJ       token.text: unregistered
token.i: 2      token.idx: 17   token.pos: PUNCT     token.text: ,
token.i: 3      token.idx: 19   token.pos: DET       token.text: the
token.i: 4      token.idx: 23   token.pos: NOUN      token.text: folder
token.i: 5      token.idx: 30   token.pos: VERB      token.text: went
token.i: 6      token.idx: 35   token.pos: ADV       token.text: away
token.i: 7      token.idx: 40   token.pos: ADP       token.text: from
token.i: 8      token.idx: 45   token.pos: DET       token.text: the
token.i: 9      token.idx: 49   token.pos: PRON      token.text: she
token.i: 10     token.idx: 52   token.pos: VERB      token.text: ll
token.i: 11     token.idx: 54   token.pos: PUNCT     token.text: .

person Franck Dernoncourt    schedule 26.01.2017    source источник


Ответы (1)


spacy позволяет добавлять исключения в токенизатор.

Добавление исключения для предотвращения разделения строки shell токенизатором может быть выполнено с помощью nlp.tokenizer.add_special_case следующим образом:

import spacy
from spacy.symbols import ORTH, LEMMA, POS
nlp = spacy.load('en')

nlp.tokenizer.add_special_case(u'shell',
    [
        {
            ORTH: u'shell',
            LEMMA: u'shell',
            POS: u'NOUN'}
     ])

# https://spacy.io/docs/usage/processing-text
document = nlp(u'Once unregistered, the folder went away from the shell.')

for token in document:
    print('token.i: {2}\ttoken.idx: {0}\ttoken.pos: {3:10}token.text: {1}'.
      format(token.idx, token.text,token.i,token.pos_))

который выводит:

token.i: 0      token.idx: 0    token.pos: ADV       token.text: Once
token.i: 1      token.idx: 5    token.pos: ADJ       token.text: unregistered
token.i: 2      token.idx: 17   token.pos: PUNCT     token.text: ,
token.i: 3      token.idx: 19   token.pos: DET       token.text: the
token.i: 4      token.idx: 23   token.pos: NOUN      token.text: folder
token.i: 5      token.idx: 30   token.pos: VERB      token.text: went
token.i: 6      token.idx: 35   token.pos: ADV       token.text: away
token.i: 7      token.idx: 40   token.pos: ADP       token.text: from
token.i: 8      token.idx: 45   token.pos: DET       token.text: the
token.i: 9      token.idx: 49   token.pos: NOUN      token.text: shell
token.i: 10     token.idx: 54   token.pos: PUNCT     token.text: .
person Franck Dernoncourt    schedule 26.01.2017
comment
Есть идеи, почему добавление особого случая для строки [LOCATION] приводит к трем токенам - [, LOCATION,]? Разве это не должно работать для всех струн? - person singleton; 22.02.2017
comment
@singleton Две непроверенные идеи: 1. add_special_case игнорирует знаки препинания 2. add_special_case принимает в качестве аргумента регулярное выражение. - person Franck Dernoncourt; 22.02.2017
comment
Spacy отлично работает. Похоже, я допустил ошибку при копировании примера токенизации с просторного сайта. Ваше здоровье. - person singleton; 22.02.2017
comment
Почему оболочка в настоящее время разделяется токенизатором? - person lucid_dreamer; 02.03.2018
comment
@ user1712447 Не знаю, код не смотрел. Вероятно, это побочный эффект того, что она ... - person Franck Dernoncourt; 02.03.2018
comment
Звучит довольно произвольно и заставляет задуматься о других инициативах, которые может предпринять Спейси. - person lucid_dreamer; 02.03.2018
comment
Однако это не решает другие подобные случаи, такие как продажа, ну и т. Д. Есть ли более общее решение? - person Yan Yang; 23.02.2019