Почему я получаю TypeError при импорте текстового файла построчно для анализа настроений вместо использования жестко закодированного предложения? - PullRequest
1 голос
/ 07 июня 2019

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

s ["index"],

TypeError: индексы списка должны быть целыми числами или кусочками, а не str

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Похоже, я решил проблему.Как указывал Лондо: эта строка устанавливает 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
0 голосов
/ 07 июня 2019

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

И последнее, на что следует обратить внимание.В описании вы связаны, в примечаниях.Там он сообщает о том, как передать текст в API.И там он объясняет, что API избавляется от нарезки и форматирования, вы должны только отправить весь текст.Если вы не получили никаких результатов, имейте это в виду

...