Невозможно запустить аннотатор Stanford Core NLP для всего набора данных

Я пытался использовать Stanford Core NLP для набора данных, но он останавливается на определенных индексах, которые я не могу найти. Набор данных доступен на Kaggle: https://www.kaggle.com/PromptCloudHQ/amazon-reviews-unlocked-mobile-phones/data

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

import json
def funcSENT(paragraph):
    
    
    all_scores = []
    
    output = nlp.annotate(paragraph, properties={
        "annotators": "tokenize,ssplit,parse,sentiment",
        "outputFormat": "json",
        # Only split the sentence at End Of Line. We assume that this method only takes in one single sentence.
        #"ssplit.eolonly": "true",
        # Setting enforceRequirements to skip some annotators and make the process faster
        "enforceRequirements": "false"
    })
    
    
    all_scores = []
    for i in range(0,len(output['sentences'])):
        all_scores.append((int(json.loads(output['sentences'][i]['sentimentValue']))+1))
        

    final_score = sum(all_scores)/len(all_scores)
    
    return round(final_score)
 

Теперь я запускаю этот код для каждого обзора в столбце «Отзывы», используя этот код.

import pandas as pd
data_file = 'C:\\Users\\SONY\\Downloads\\Amazon_Unlocked_Mobile.csv'
data = pd.read_csv( data_file)

from pandas import *
i = 0
my_reviews = data['Reviews'].tolist()
senti = []
while(i<data.shape[0]):
    senti.append(funcSENT(my_reviews[i]))
    i=i+1

Но почему-то я получаю эту ошибку, и я не могу найти проблему. Прошло много часов, пожалуйста, помогите.

   [1]: https://i.stack.imgur.com/qFbCl.jpg

Как избежать этой ошибки?


person Rituraj Singh    schedule 24.12.2017    source источник


Ответы (1)


Насколько я понимаю, вы используете pycorenlp с nlp=StanfordCoreNLP(...) и работающим сервером StanfordCoreNLP. Я не буду проверять данные, которые вы используете, так как для этого требуется учетная запись Kaggle.

Запуск с той же настройкой, но с другим абзацем показывает, что только печать «вывода» показывает ошибку с сервера Java, в моем случае:

java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: Input word not tagged

Я ДУМАЮ, что из-за отсутствия аннотатора частей речи сервер не может выполнить синтаксический анализ. Всякий раз, когда вы используете parse или depparse, я думаю, вам также нужно иметь аннотатор «pos».

Я не уверен, что нужно аннотатору настроений, но вам могут понадобиться другие аннотаторы, такие как «лемма», чтобы получить хорошие результаты тональности.

Вывод на печать сам по себе. Если вы получаете ту же ошибку Java, попробуйте добавить аннотатор «pos», чтобы увидеть, получите ли вы ожидаемый json. В противном случае попробуйте привести более простой пример, возможно, используя свой собственный небольшой набор данных, и прокомментируйте или скорректируйте свой вопрос.

person Joe Mitchell    schedule 24.12.2017
comment
Пытался добавить аннотатор 'pos', но все еще получал ошибку TypeError: строковые индексы должны быть целыми числами. Он работает до некоторого индекса, но затем выдает эту ошибку. - person Rituraj Singh; 25.12.2017
comment
Если вы печатаете (выводите) после его вычисления, что он говорит? - person Joe Mitchell; 25.12.2017
comment
В соответствии с кодом я использую output['Sentiment'][i]['sentimentValue'] Но если вы запрашиваете индивидуальную итерацию, то при печати вывода для каждой итерации выводится словарь информации для каждого предложения. - person Rituraj Singh; 25.12.2017
comment
ОК, значит, он дает действительный «выход» после расчета? Я думал, что сервер ошибается, так как я мог воспроизвести ошибку таким образом. Это может дать больше информации об отладке, если вывод сервера что-то говорит. - person Joe Mitchell; 25.12.2017
comment
Сервер отображает java.util.concurrent.TimeoutException - person Rituraj Singh; 25.12.2017
comment
В противном случае напечатайте output['sentences'][i] перед output[][]['sentimentValue'], посмотрите, сможете ли вы найти словарь предложений, который выдает реальную ошибку. - person Joe Mitchell; 25.12.2017
comment
Ах. Я столкнулся с проблемой, из-за которой я не мог загрузить более 100 000 символов в один вызов аннотации, прежде чем он отказался обрабатываться. Позвольте мне найти вопрос... =1#comment80305482_46678484" title="как обойти ограничение в 100 тыс. символов для сервера stanfordnlp"> stackoverflow.com/questions/46678204/ - person Joe Mitchell; 25.12.2017
comment
Не уверен, что это вызвало TimeoutException, но могло быть. Сколько данных в csv? Если вы загрузите только половину, это сработает? Попробуйте такую ​​отладку. - person Joe Mitchell; 25.12.2017
comment
Данные огромны. 400 000 строк, каждая из которых имеет рейтинг и обзор. - person Rituraj Singh; 25.12.2017
comment
Такое количество данных, безусловно, вызовет исключение тайм-аута, но я не знаю, почему несколько отдельных вызовов nlp.annotate будут пакетными, так что, возможно, нет. Отсюда выясните, какой обзор вызывает тайм-аут, распечатайте его непосредственно перед вызовом nlp.annotate. Добавьте в вопрос дополнительную информацию об отладке. - person Joe Mitchell; 25.12.2017