Перебор лексем в списках внутри списков с использованием циклов for в python (SpaCy)

1

Я относительно новый, поэтому я мог бы сделать некоторую действительно основную ошибку, но из того, что, как я понимаю, вы будете перебирать токены внутри списка-внутри-списка в 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, сохраняя целостность исходных списков.

  • 0
    похоже, в вашем списке есть не повторяемый объект. Вы можете добавить print type(eachlist) и print type(eachword) внутри цикла for .
Теги:
for-loop
spacy

1 ответ

1
Лучший ответ

Ниже приведен код для итерации элементов вложенных списков:

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("")

Выходы идентичны.

Надеюсь, поможет!

  • 0
    Большое спасибо @gdaras У меня был новый вопрос о всплывающем окне SpaCy, и я хотел, чтобы ваше мнение, потому что вы, кажется, очень хорошо разбираетесь в SpaCy [ stackoverflow.com/questions/52807080/…, любая помощь очень ценится! Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню