Облако слов делает ошибку в Python: строковые индексы должны быть целыми числами

Я пытаюсь сделать облако слов из текстового файла с помощью этого кода:

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from wordcloud import WordCloud, STOPWORDS
from IPython.display import Image as im

file = open("T.txt", encoding='utf-8')
FR = file.read()


raw_file = []

for line in FR:
    raw_file.append(line['text'])

words = raw_file.split(" ")
words = [w for w in words if len(w) > 2]  
words = [w.lower() for w in words]
words = [w for w in words if w not in STOPWORDS]


word_list = (words)
word_counter = {}
for word in word_list:
     if word in word_counter:
         word_counter[word] += 1
     else:
         word_counter[word] = 1

popular_words = sorted(word_counter, key = word_counter.get, reverse = True)

topp = popular_words

topp.remove('https')


mask = np.array(Image.open('/Users/x/Downloads/B.png'))

wc = WordCloud(background_color="black", max_words=2000, mask=mask)
clean_string = ','.join(topp)
wc.generate(clean_string)



plt.imshow(wc, interpolation='bilinear')
plt.title("Title", size=40)
plt.axis("off")
plt.show()

Как и в заголовке, он выдает ошибку: строковые индексы должны быть целыми числами в raw_file.append (строка ['текст']). Я пробовал несколько разных способов заставить его работать, но это не помогло, поэтому я прошу здесь о помощи.

Заранее спасибо.


person qrwerwer    schedule 18.02.2020    source источник


Ответы (3)


заменять

raw_file.append(line['text'])

с участием

raw_file.append(line)

когда вы делаете line['text'], вы пытаетесь взять элемент «текст» из объекта line, но строка является строкой, а 'text' не является допустимым индексом для строкового типа.

на самом деле то, что вы хотите, обычно было бы

with open('T.txt') as f:
    raw_file = f.readlines()

потому что он делает то, что вы, кажется, пытаетесь сделать, а затем закрывает обработчик файла в конце, а не оставляет его открытым (как вы сейчас делаете).

Тогда у вас возникнут проблемы, потому что вы пытаетесь рассматривать список строк как строку, а это не так. Я предлагаю вам попробовать написать это строка за строкой и решить, что вы действительно хотите делать. В конце концов, Stackoverflow напишет за вас весь этот код, но на самом деле это не поможет вам чему-то научиться.

person Stael    schedule 18.02.2020

line из file.read() читает один символ. Вы хотите использовать file.readlines() и перебирать его. Я не знаю, почему вы пытаетесь использовать строку как словарь line['text']. Это вызывает ошибку, поскольку вы не можете получить доступ к клавише text.

person Mattia Peracchi    schedule 18.02.2020

Вы делаете несколько ненужных вещей, без которых вы можете немного упростить свой код. Фактическая проблема заключается в том, как вы индексируете line['text'], но есть также проблема с тем, как вы затем превращаете raw_file в words.

На самом деле вам не нужно FR = file.read() (из file.readlines()). for line in file: делает то же самое для вас.

При добавлении строк к raw_file и последующем использовании .split(" ") будет предпринята попытка разбить список строк, что даст вам следующую ошибку. Вы можете просто разделить строку и добавить ее в свой список words.

Вам также не нужно менять words на word_list или popular_words на topp. IMHO это только создает больше переменных и делает код менее читаемым.

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from wordcloud import WordCloud, STOPWORDS
from IPython.display import Image as im

file = open("T.txt", encoding='utf-8')

words = []

for line in file:
    words += line.split()

words = [w for w in words if len(w) > 2]  
words = [w.lower() for w in words]
words = [w for w in words if w not in STOPWORDS]

word_counter = {}
for word in words:
     if word in word_counter:
         word_counter[word] += 1
     else:
         word_counter[word] = 1

popular_words = sorted(word_counter, key = word_counter.get, reverse = True)

popular_words.remove('https')

mask = np.array(Image.open('/Users/x/Downloads/B.png'))

wc = WordCloud(background_color="black", max_words=2000, mask=mask)
clean_string = ','.join(popular_words)
wc.generate(clean_string)

plt.imshow(wc, interpolation='bilinear')
plt.title("Title", size=40)
plt.axis("off")
plt.show()
person Niels Henkens    schedule 18.02.2020