Пространство Удалить стоп-слова, не затрагивая именованные объекты - PullRequest
1 голос
/ 25 сентября 2019

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

import spacy
nlp = spacy.load('en_core_web_sm')
text = "The Bank of Australia has an agreement according to the Letter Of Offer which states that the deduction should be made at the last date of each month"
doc = nlp(text)

Если я проверяю именованные объекты в тексте, я получаю следующее

print(doc.ents)
(The Bank of Australia, the Letter Of Offer, the last date of each month)

Обычный способ удаления стоп-слов будет выглядеть следующим образом:

[token.text for token in doc if not token.is_stop]
['Bank',
 'Australia',
 'agreement',
 'according',
 'Letter',
 'Offer',
 'states',
 'deduction',
 'date',
 'month']

Обычный способ полностью убирает смысл, необходимый для моей задачи.Я хотел бы сохранить именованные объекты.

Я попытался добавить именованные объекты с тем же списком.

list1 = [token.text for token in doc if not token.is_stop]
list2 = [str(a) for a in doc.ents]

list1 + list2

['Bank',
 'Australia',
 'agreement',
 'according',
 'Letter',
 'Offer',
 'states',
 'deduction',
 'date',
 'month',
 'The Bank of Australia',
 'the Letter Of Offer',
 'the last date of each month']

Есть ли другой подход к этому?

1 Ответ

1 голос
/ 25 сентября 2019

Вы можете проверить на уровне токена, является ли он частью сущности, используя token.ent_iob_ или token.ent_type_, см. документацию API .Таким образом, вы, вероятно, хотите что-то вроде этого:

print([token.text for token in doc if token.ent_type_ or not token.is_stop])

, который возвращает

['The,,' Bank ',' of ',' Australia ',' Agreement ','в соответствии с ',' the ',' Letter ',' Of ',' Offer ',' States ',' Deduction ',' the ',' Last ',' Date ',' of ',' each ',' month ']

...