Я относительно новый, поэтому я мог бы сделать некоторую действительно основную ошибку, но из того, что, как я понимаю, вы будете перебирать токены внутри списка-внутри-списка в python следующим образом:
for each_list in full_list:
for each_token in each_list:
do whatever you wannna do
Однако при использовании SpaCy кажется, что первый for-loop выполняет итерацию по токенам, а не по спискам.
Итак, код:
for eachlist in alice:
if len(eachlist) > 5:
print eachlist
(где alice - список списков, и каждый список - это предложение, содержащее токенизированные слова)
на самом деле печатает каждое слово, состоящее из более чем 5 букв, а не каждое предложение длиной более 5 слов (что должно быть сделано, если оно действительно находится на "первом уровне" для цикла.
И код:
newalice = []
for eachlist in alice:
for eachword in eachlist:
#make a new list of lists where each list contains only words that are classified as nouns, adjectives, or verbs (with a few more specific stipulations)
if (eachword.pos_ == 'NOUN' or eachword.pos_ == 'VERB' or eachword.pos_ == 'ADJ') and (eachword.dep_ != 'aux') and (eachword.dep_ != 'conj'):
newalice.append([eachword])
возвращает ошибку: "TypeError: объект" spacy.tokens.token.Token "не является итерируемым".
Причина, по которой я хочу сделать это в вложенных циклах, заключается в том, что я хочу, чтобы newalice был списком списков (я все еще хочу иметь возможность перебирать предложения, я просто хотел избавиться от слов, которые мне не нравятся около).
Я не знаю, если я делаю некоторые основные ошибки в моем коде, или если SpaCy делает что-то странное, но в любом случае я бы очень признателен за любую помощь в том, как перебирать элементы в списке в одном - список в SpaCy, сохраняя целостность исходных списков.
Ниже приведен код для итерации элементов вложенных списков:
list_inst = [ ["this", " ", "is", " ", "a", " ", "sentence"], ["another", " ", "one"]]
for sentence in list_inst:
for token in sentence:
print(token, end="")
print("")
Я думаю, что ваше недоразумение исходит из того, что каждое предложение в spacy не сохраняется в списке, а в объекте doc. Объект doc является итерабельным и содержит токены, но также и дополнительную информацию.
Пример кода:
# iterate to sentences after spacy preprocessing
import spacy
nlp = spacy.load('en_core_web_sm')
doc1 = nlp("this is a sentence")
doc2 = nlp("another one")
list_inst = [doc1, doc2]
for doc in list_inst:
for token in doc:
print(token, end=" ")
print("")
Выходы идентичны.
Надеюсь, поможет!
print type(eachlist)
иprint type(eachword)
внутри циклаfor
.