Можно ли добавить часть речевого тега в особый случай токенизатора spaCy?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Можно ли добавить часть речевого тега в особый случай токенизатора spaCy?

Сообщение Anonymous »

У меня есть список соединений и других особых случаев, которые я хочу, чтобы SpaCy распознавал как токены, например «согласно» и «стиральная машина». Для этого я использовал add_special_case:

Код: Выделить всё

    import spacy
from spacy.attrs import ORTH

nlp = spacy.load("en_core_web_sm")

text = "according to reports the washing machine industry is declining"

special_case_1 = [{ORTH: 'according to'}]
nlp.tokenizer.add_special_case('according to', special_case_1)

special_case_2 = [{ORTH: 'washing machine'}]
nlp.tokenizer.add_special_case('washing machine', special_case_2)

doc = nlp(text)

for token in doc:
print(token, token.pos_)
Кажется, это работает, но тег POS теперь является именем собственным, тогда как он должен быть предлогом (ADP) для «согласно» и СУЩЕСТВИТЕЛЬНЫМ для «стиральной машины»:

Код: Выделить всё

    according to PROPN
reports VERB
the DET
washing machine PROPN
industry NOUN
is AUX
declining VERB
Кто-нибудь знает, есть ли способ назначить тег POS для особого случая? (В документации я ничего не нашел). Или, может быть, есть лучший способ токенизировать соединения?
Решение
Решение заключалось в использовании AttributeRuler в spaCy. https://spacy.io/usage/linguistic-featu ... Exceptions

Код: Выделить всё

    import spacy
from spacy.attrs import ORTH

nlp = spacy.load("en_core_web_sm")

text = "according to reports the washing machine is more
popular than air conditioning because of an unknown reason"

compounds = ['according to', 'because of', 'washing machine',
'air conditioning']

for comp in compounds:
special_case = [{ORTH: comp}]
nlp.tokenizer.add_special_case(comp, special_case)
Это дало четырем соединениям следующие теги:

Код: Выделить всё

    according to PROPN NNP
washing machine PROPN NNP
air conditioning VERB VBG
because of VERB VBZ
Затем я использовал AttributeRuler:

Код: Выделить всё

    ruler = nlp.get_pipe("attribute_ruler")

prepositions = ['according to', 'because of']
nouns = ['washing machine', 'air conditioning']

for prep in prepositions:
preposition_patterns = [[{"LOWER": prep}]]
preposition_attrs = {"TAG": "IN", "POS": "ADP"}
ruler.add(patterns=preposition_patterns,
attrs=preposition_attrs)

for noun in nouns:
noun_patterns = [[{"LOWER": noun}]]
noun_attrs = {"TAG": "NN", "POS": "NOUN"}
ruler.add(patterns=noun_patterns, attrs=noun_attrs)
На этот раз результат был таким, каким я хотел:

Код: Выделить всё

doc = nlp(text)

for token in doc:
print(token, token.tag_, token.pos_)
Полный вывод:

Код: Выделить всё

according to IN ADP
reports VBZ VERB
the DT DET
washing machine NN NOUN
is VBZ AUX
more RBR ADV
popular JJ ADJ
than IN ADP
air conditioning NN NOUN
because of IN ADP
an DT DET
unknown JJ ADJ
reason NN NOUN
Мне еще нужно поработать над токенизацией леммы сложного существительного (включая форму множественного числа). В моем случае список составных слов достаточно мал, чтобы вручную добавить форму множественного числа каждого составного существительного в список составных существительных, но это, вероятно, не лучшее решение.

Подробнее здесь: https://stackoverflow.com/questions/714 ... ecial-case
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как создать кривую хвостовую часть речевого пузыря с помощью CSS?
    Anonymous » » в форуме CSS
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Можно ли переносить старые модели Spacy в будущие версии Spacy?
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Spacy nlp = spacy.load("en_core_web_lg")
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Почему Presidio с Spacy NLP Engine не распознает организации и Pesel, пока Spacy делает?
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как удалить накладную STT -коробку из API речевого режизализатора в Android Studio?
    Anonymous » » в форуме Android
    0 Ответы
    0 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»