Почему я получаю TypeError при импорте текстового файла построчно для анализа настроений вместо использования жестко закодированного предложения?
Я пытаюсь проанализировать настроение каждого данного предложения из текстового файла построчно. Код работает всякий раз, когда я использую жестко закодированные предложения из первого связанного вопроса. Когда я использую ввод текстового файла, я получаю TypeError
,
Это связано с вопросом, заданным здесь. И строка за строкой из кода текстового файла исходит из этого вопроса:
Первый работает, второй с текстовым файлом ("I love you. I hate him. You are nice. He is dumb")
не работает. Вот код:
from pycorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP('http://localhost:9000')
results = []
with open("c:/nlp/test.txt","r") as f:
for line in f.read().split('\n'):
print("Line:" + line)
res = nlp.annotate(line,
properties={
'annotators': 'sentiment',
'outputFormat': 'json',
'timeout': 1000,
})
results.append(res)
for res in results:
s = res["sentences"]
print("%d: '%s': %s %s" % (
s["index"],
" ".join([t["word"] for t in s["tokens"]]),
s["sentimentValue"], s["sentiment"]))
Я получаю эту ошибку:
строка 21, в
с ["индекс"],
Ошибка типа: индексы списка должны быть целыми числами или частями, а не str
2 ответа
Похоже, я решил проблему. Как Лондо указал: эта линия устанавливает S
как List
, но это должно быть dict
так же, как в оригинальном коде:
s = res["sentences"]
Я переместил код в тот же цикл, где файл читается и анализируется построчно, и я печатаю результат прямо там. Итак, новый код выглядит так:
from pycorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP('http://localhost:9000')
with open("c:/nlp/test.txt","r") as f:
for line in f.read().split('\n'):
res = nlp.annotate(line,
properties={
'annotators': 'sentiment',
'outputFormat': 'json',
'timeout': 15000,
})
for s in res["sentences"]:
print("%d: '%s': %s %s" % (
s["index"],
" ".join([t["word"] for t in s["tokens"]]),
s["sentimentValue"], s["sentiment"]))
Результат выглядит так, как задумано и без каких-либо сообщений об ошибках:
0: 'I love you .': 3 Positive
0: 'I hate him .': 1 Negative
0: 'You are nice .': 3 Positive
0: 'He is dumb .': 1 Negative
Я не установил Stanfort-lib, поэтому я не смог протестировать его систему. но, кстати, он возвращает позвольте мне сказать, что ваша переменная результатов имеет тип "Список Dicts" или какой-то вложенный тип
во всяком случае я сделал тест
results = []
with open("tester.txt","r") as f:
for line in f.read().split('\n'):
print("Line:" + line)
sentences = [
{
"index":1,
"word":line,
"sentimentValue": "sentVal",
"sentiment":"senti"
}
]
results.append(sentences)
затем я строю ваш цикл и немного подправляю его под свои нужды, например:
for res in results:
for s in res:
print("%d: '%s': %s %s" % (
s["index"],
" ".join(s["word"]),
s["sentimentValue"], s["sentiment"]))
что напечатало мне следующее
1: 'I l o v e y o u .': sentVal senti
1: 'I h a t e h i m .': sentVal senti
1: 'Y o u a r e n i c e .': sentVal senti
1: 'H e i s d u m b': sentVal senti
Так что в основном код работает. но вы должны выяснить, к какому типу относится возвращаемое значение, после того, как оно возвращается из этого API Stanfort -> "type(results)", например
Когда у вас есть эта информация, вы можете начать с цикла, который проходит через значения, и если вы не знаете, какой тип является вложенным значением, вы вызываете anotehr print типа. Идите вниз до тех пор, пока не достигнете слоя с элементами, с которыми вы хотите работать
И последнее, на что следует обратить внимание. В описании вы связаны, в примечаниях. Там он сообщает о том, как передать текст в API. И там он объясняет, что API избавляется от нарезки и форматирования, вы должны только отправить весь текст. Если вы не получите никаких результатов, имейте это в виду