Удаление имен существительных, содержащих стоп-слова, с помощью spaCy - PullRequest
0 голосов
/ 15 сентября 2018

Я использую spaCy для поиска наиболее употребительных существительных и существительных-фраз

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

docx = nlp('The bird is flying high in the sky blue of color')

# Just looking at nouns
nouns = []
for token in docx:
    if token.is_stop != True and token.is_punct != True and token.pos_ == 'NOUN':
        nouns.append(token)

# Count and look at the most frequent nouns #
word_freq = Counter(nouns)
common_nouns = word_freq.most_common(10)

Использование noun_chunks в порядкеоднако определение фраз приводит к ошибке атрибута

noun_phrases = []
for noun in docx.noun_chunks: 
    if len(noun) > 1 and '-PRON-' not in noun.lemma_ and noun.is_stop:
        noun_phrases.append(noun)

AttributeError: у объекта 'spacy.tokens.span.Span' нет атрибута> 'is_stop'

Я понимаюхарактер сообщения, но я не могу на всю жизнь правильно получить синтаксис, в котором присутствие стоп-слова в лемматизированной строке исключает возможность добавления в список noun_phrases

Вывод безудаление стоп-слов

[{'word': 'the bird', 'lemma': 'the bird', 'len': 2}, {'word': 'sky blue', 'лемма ':' небесно-голубой ',' len ': 3}]

Предполагаемый вывод (удаление леммы, содержащей стоп-слова, которые включают "the"

[{}]

1 Ответ

0 голосов
/ 18 сентября 2018

Какую версию spacy и python вы используете?

Я использую Python 3.6.5 и spacy 2.0.12 на Mac High Sierra.Ваш код, кажется, отображает предполагаемый вывод.

import spacy
from collections import Counter

nlp = spacy.load('en_core_web_sm')

docx = nlp('The bird is flying high in the sky blue of color')

# Just looking at nouns
nouns = []
for token in docx:
    if token.is_stop != True and token.is_punct != True and token.pos_ == 'NOUN':
        nouns.append(token)

# Count and look at the most frequent nouns #
word_freq = Counter(nouns)
common_nouns = word_freq.most_common(10)

print( word_freq)
print(common_nouns)


$python3  /tmp/nlp.py
Counter({bird: 1, sky: 1, blue: 1, color: 1})
[(bird, 1), (sky, 1), (blue, 1), (color, 1)]

Кроме того, 'is_stop' является атрибутом docx.Вы можете проверить через

>>> dir(docx)

Возможно, вы захотите обновить spacy и его зависимости и посмотреть, поможет ли это.

Кроме того, flying - это VERB, поэтому даже после лемметизации,он не будет добавлен в соответствии с вашим состоянием.

token.text, token.lemma_, token.pos_, token.tag_, token.dep_,
          token.shape_, token.is_alpha, token.is_stop
flying fly VERB VBG ROOT xxxx True False

EDIT-1

Вы можете попробовать что-то вроде этого.Так как мы не можем использовать is_stop непосредственно для кусков слова, мы можем перебирать каждый блок для слова и проверять условие в соответствии с вашими требованиями.(например, не имеет stop_word и имеет длину> 1 и т. д.).Если это удовлетворено, тогда мы добавляем в список.

noun_phrases = []
for chunk in docx.noun_chunks:
    print(chunk)
    if all(token.is_stop != True and token.is_punct != True and '-PRON-' not in token.lemma_ for token in chunk) == True:
        if len(chunk) > 1:
            noun_phrases.append(chunk)
print(noun_phrases)

Результат:

python3 /tmp/so.py
Counter({bird: 1, sky: 1, blue: 1, color: 1})
[(bird, 1), (sky, 1), (blue, 1), (color, 1)]
The bird
the sky blue
color
[]   # contents of noun_phrases is empty here.

Надеюсь, это поможет.Вы можете настроить условия в if all в соответствии с вашими требованиями.

...