AttributeError в spacy token.pos_ - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над токенизацией, лемматизацией и удалением стоп-слов из документа. Однако Spacy выдает ошибку, сообщающую, что модуль token.pos_ не принимает 'str'. Я считаю, что строки - это правильный формат, поправьте меня, если я ошибаюсь. Как мне исправить эту ошибку?

words = []
classes = []
documents = []
ignore_words = ['?']
# loop through each sentence in our training data
for pattern in training_data:
    # tokenize each word in the sentence
    w = gensim.utils.simple_preprocess(str(pattern['sentence']), deacc=True)
    # add to our words list
    words.extend(w)
    # add to documents in our corpus
    documents.append((w, pattern['class']))
    # add to our classes list
    if pattern['class'] not in classes:
        classes.append(pattern['class'])

nltk.download('stopwords')
stop_words = stopwords.words('english')
stop_words.extend(["be", "use", "fig"])
words = [word for word in words if word not in stop_words] 

# stem and lower each word and remove duplicates
import en_core_web_lg
nlp = en_core_web_lg.load()
print(words[0:10])

words = [token.lemma_ for token in words if token.pos_ in postags]
words = list(set(words))

AttributeError                            Traceback (most recent call last)
<ipython-input-72-5c31e2b5a13c> in <module>()
     26 
     27 from spacy import tokens
---> 28 words = [token.lemma_ for token in words if token.pos in postags]
     29 words = list(set(words))
     30 

<ipython-input-72-5c31e2b5a13c> in <listcomp>(.0)
     26 
     27 from spacy import tokens
---> 28 words = [token.lemma_ for token in words if token.pos in postags]
     29 words = list(set(words))
     30 

AttributeError: 'str' object has no attribute 'pos'

1 Ответ

0 голосов
/ 26 июня 2018

Ваш код показывает words следующим образом:

words = [word for word in words if word not in stop_words]

Каждый word является stringType и не является token объектом из spaCy. Таким образом, вы видите эту ошибку.

Чтобы это исправить:

# Make the spaCy doc obj for the sentence
doc = nlp(pattern['sentence'])

# get words (tokens) for the sentence
words = [w for w in doc.sents[0]]

# Now words will have the .pos_ tag and .lemma_
toks = [token.lemma_ for token in words if token.pos_ not in postags] 
...