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

Другие вопросы по тегам