Как извлечь специальные символы, используя NLTK RegexpParser Chunk для POS_tagged слов в Python

У меня есть текст, например, сказать: 80% of $300,000 Each Human Resource/IT Department.

Мне нужно было бы извлечь $300,000 вместе со словами Each Human Resource/IT Department

Я использовал pos-теги, чтобы пометить слова после токенизации. Я смог извлечь 300 000, но не смог извлечь знак $ вместе с ним.

Что у меня так далеко:

text = '80% of $300,000 Each Human Resource/IT Department'
train_text = text
sample_text = text
custom_sent_tokenizer = PunktSentenseTokenizer(train_text)
tokenized = custom_sent_tokenizer.tokenize(sample_text)

for i in tokenized:
    words = nltk.word_tokenize(i)
    tagged = nltk.pos_tag(words)

chunkGram = r"""chunk: {<DT>+<NN.*>+<NN.*>?|<NNP>?|<CD>+<NN>?|<NNP>?}"""


chunkParser = nltk.RegexpParser(chunkGram)
chunked = chunkParser.parse(tagged)

фрагментарный вывод при включении в список - ['80 %', '300,000', 'Each Human Resource/IT Department']

Что я хотел: ['80 %', '**$**300,000', 'Each Human Resource/IT Department']

Я старался

chunkGram = r"""chunk: {**</$CD>|**<DT>+<NN.*>+<NN.*>?|<NNP>?|<CD>+<NN>?|}? """

Это все еще не работает. Итак, все, что мне нужно, это $ вместе с CD

1 ответ

Решение

Вам нужно добавить <\ $>? в вашей грамматике.

chunkGram = r"""chunk: {<DT>+<NN.*>+<NN.*>?|<\$>?<CD>+<NN>?|<NNP>?}"""

Код:

import nltk
from nltk.tokenize import PunktSentenceTokenizer

text = '80% of $300,000 Each Human Resource/IT Department'
train_text = text
sample_text = text
custom_sent_tokenizer = PunktSentenceTokenizer(train_text)
tokenized = custom_sent_tokenizer.tokenize(sample_text)

for i in tokenized:
    words = nltk.word_tokenize(i)
    tagged = nltk.pos_tag(words)

chunkGram = r"""chunk: {<DT>+<NN.*>+<NN.*>?|<\$>?<CD>+<NN>?|<NNP>?}"""

chunkParser = nltk.RegexpParser(chunkGram)
chunked = chunkParser.parse(tagged)

print(chunked)

Выход:

(S
  (chunk 80/CD %/NN)
  of/IN
  (chunk $/$ 300,000/CD)
  (chunk Each/DT Human/NNP Resource/IT/NNP Department/NNP))
Другие вопросы по тегам