Фильтрация определенных слов из строки на основе положения слов в тексте - PullRequest
0 голосов
/ 28 октября 2019

У меня есть несколько частей речевых правил, и они срабатывают только в том случае, если просматриваемый текст соответствует правилу. Однако мне любопытно, есть ли способ удалить «любое» слово, которое появляется между фразой, которая иначе вызвала бы правило. Я пытался использовать стоп-слова, но он слишком сильно лишает текст, чтобы правило стало бессмысленным. Вот пример.

Text: I want to attack this player's base.

attack_rule = [
                ('nn', 'i'),
                ('vbp', 'want'),
                ('to', 'to'),
                ('vb', ('exterminate', 'waste', 'attack', 'shoot'))
                ]

Текст будет запускать это правило, однако, если текст записан так:

Text2: I f***ing want to attack this player's base.
Text2: I want to f***ing attack this player's base.

Правило не сработает. Так что мне интересно, есть ли способ отфильтровать ругательства / наполнители из текста, которые в противном случае вызвали бы правило? В идеале по позиции.

В настоящее время я использую POS-тэгер nltk. Если есть способ убедиться, что слово не имеет контекстуального влияния на предложение (как превосходная степень), что может показаться намного сложнее. Или просто удалите слово, если оно появляется между текстом, который в противном случае вызвал бы правило.

Я пытался использовать стоп-слова, но, как я уже сказал, оно слишком сильно отфильтровывалось, особенно когда объект предложения был одним из самыхважные части.

He will attack all of them <- Stop words present
 he attack <- Filtered stop words

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Как выглядит ваша логика, которая проверяет, соответствует ли POS, помеченный из предложения, вашему шаблону? Похоже, что вы можете просто игнорировать определенное количество слов с тегами, которые не соответствуют до конца предложения, и иметь совпадение, если вы нашли все слова с тегами (в правильном порядке), которые вы хотели в конце. Вы также можете установить максимальное количество последовательных слов с ошибочными тегами в строке.

Также вы можете игнорировать слова только с несколькими видами тегов, такими как наречие или прилагательное

0 голосов
/ 29 октября 2019

Вы можете использовать разбор зависимостей для удаления модификаторов, как показано в следующем коде:

import spacy
from spacy import displacy
nlp = spacy.load('en_core_web_lg', disable = ['ner'])

sentences = [ "I fucking want to attack this player's base." , "I want to fucking attack this player's base."]

for s in sentences:
    doc = nlp(s)
    print(s)
    print("=>", " ".join([t.text for t in doc if not t.dep_.endswith('mod') ]))

#I fucking want to attack this player's base.
#=> I want to attack this player 's base .
#I want to fucking attack this player's base.
#=> I want to attack this player 's base .

...