Как заставить тег pos в пространстве до / после теггера?

Если я обработаю приговор

'Верните целевую карту в руку'

с spacy и моделью en_web_core_lg он распознает токены, как показано ниже:

Верните СУЩЕСТВИТЕЛЬНОЕ целевое СУЩЕСТВИТЕЛЬНОЕ КАРТОЧНОЕ СУЩЕСТВИТЕЛЬНОЕ в ADP свою ADJ руку СУЩЕСТВИТЕЛЬНОЕ

Как я могу заставить 'Return' быть помечен как ГЛАГОЛ? И как я могу сделать это до синтаксического анализатора, чтобы синтаксический анализатор мог лучше интерпретировать отношения между токенами?

Есть и другие ситуации, в которых это может быть полезно. Я имею дело с текстом, который содержит определенные символы, такие как {G}. Эти три символа следует рассматривать как СУЩЕСТВИТЕЛЬНОЕ, а {T} должно быть ГЛАГОЛОМ. Но прямо сейчас я не знаю, как этого добиться без разработки новой модели токенизации и тегирования. Если бы я мог «принудительно» использовать токен, я мог бы заменить эти символы на что-то, что было бы распознано как один токен, и принудительно пометить его соответствующим образом. Например, я мог бы заменить {G} на SYMBOLG и принудительно пометить SYMBOLG как NOUN.


person pedrovgp    schedule 09.08.2018    source источник


Ответы (1)


РЕДАКТИРОВАТЬ: это решение использовало spaCy 2.0.12 (IIRC).

Чтобы ответить на вторую часть вашего вопроса, вы можете добавить специальные правила токенизации к токенизатору, как указано в документах здесь. Следующий код должен делать то, что вы хотите, при условии, что эти символы недвусмысленны:

import spacy

from spacy.symbols import ORTH, POS, NOUN, VERB

nlp = spacy.load('en')

nlp.tokenizer.add_special_case('{G}', [{ORTH: '{G}', POS: NOUN}])
nlp.tokenizer.add_special_case('{T}', [{ORTH: '{T}', POS: VERB}])

doc = nlp('This {G} a noun and this is a {T}')

for token in doc:
    print('{:10}{:10}'.format(token.text, token.pos_))

Вывод для этого (теги неверны, но это показывает, что были применены правила особого случая):

This      DET       
{G}       NOUN      
a         DET       
noun      NOUN      
and       CCONJ     
this      DET       
is        VERB      
a         DET       
{T}       VERB      

Что касается первой части вашего вопроса, проблема с присвоением части речи отдельным словам заключается в том, что они в основном неоднозначны вне контекста (например, вернуть существительное или глагол?). Таким образом, описанный выше метод не позволит вам учитывать использование в контексте и может вызвать ошибки. Однако spaCy позволяет выполнять сопоставление с шаблоном на основе токенов, так что это стоит посмотрите на. Может быть, есть способ сделать то, что вам нужно.

person ongenz    schedule 09.08.2018
comment
Я недооценил эту часть документов. Возможно, это поможет мне и с первой частью. Я имею дело с довольно ограниченной текстовой вселенной. Так что return, скорее всего, ВСЕГДА является глаголом (если это где-то существительное, это исключение). Спасибо. - person pedrovgp; 10.08.2018
comment
Я пробовал следующее для вертикальной полосы: nlp.tokenizer.add_special_case ('{T}', [{ORTH: '|', POS: PUNC}]). это дало мне синтаксическую ошибку. Как я могу заставить мой тег отображать вертикальную полосу? - person Nina; 07.11.2020
comment
Какую версию spaCy вы использовали с этим? В 2.3.1 это не работает для меня, теги POS не затронуты. - person polm23; 09.11.2020
comment
@ polm23 Если посмотреть на историю выпусков, это должно быть 2.0.12. Я добавил это к своему ответу. - person ongenz; 10.11.2020
comment
Для spaCY 3.x см. Этот ответ stackoverflow.com/questions/65699672/ или документы spacy. io / usage / linguistic-features / # sbd - person born_naked; 09.07.2021