Какую версию 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
в соответствии с вашими требованиями.