Python 3.7 AttributeError: объект «список» не имеет атрибута «разделить»

Я пытаюсь провести анализ настроений из CSV-файла, где в каждой строке есть предложение.

Репрекс:

print(your_list)
[['Patience and Kindness and I know they truly love and care for animals, my dog also enjoys the events like seeing Santa and the Easter Bunny'], ['They are so sweet to my pets and try to fit them into the schedule when needed'], ['they call and check on our pet a day or 2 after visit make sure we fully understand treatment before we leave'], ['every member of the staff understands how our pets are our family; we never feel rushed and always have or questions answered, and are given reassurance if and when needed; they are compassionate and kind, respectful and very caring'], ['They made it a very peaceful experience when we had to put our pug to sleep '], ['They interact with my dogs and you can see the care they have for them.'], ['they make every effort to accomodate us']    


    from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

        import csv
        with open('Before.csv', "r", errors='ignore') as f:
            reader = csv.reader(f)
        your_list = list(reader)

    print(your_list)

    analyser = SentimentIntensityAnalyzer()

    def print_sentiment_scores(sentence):
        snt = analyser.polarity_scores(sentence)
        print("{:-<40} {}".format(sentence, str(snt)))

    print_sentiment_scores(your_list)

Однако я получаю следующую ошибку:

analyser = SentimentIntensityAnalyzer()

def print_sentiment_scores(sentence):
    snt = analyser.polarity_scores(sentence)
    print("{:-<40} {}".format(sentence, str(snt)))


print_sentiment_scores(your_list)

Traceback (последний последний вызов):

  File "<ipython-input-24-a7a32425d261>", line 8, in <module>
    print_sentiment_scores(your_list)

  File "<ipython-input-24-a7a32425d261>", line 4, in print_sentiment_scores
    snt = analyser.polarity_scores(sentence)

  File "C:\Users\abc\AppData\Local\Continuum\anaconda3\lib\site-packages\vaderSentiment\vaderSentiment.py", line 248, in polarity_scores
    text_token_list = text.split()

AttributeError: 'list' object has no attribute 'split'

Функция .split(" ") в your_list не помогает


person Jay Taggert    schedule 20.08.2019    source источник
comment
измените последнюю строку на [print_sentiment_scores(line) for line in your_list], таким образом вы выполняете операцию со строкой, а не со списком   -  person Tobey    schedule 20.08.2019
comment
@Tobey НЕ используйте понимание списка, если вы не планируете использовать полученный список.   -  person Error - Syntactical Remorse    schedule 20.08.2019
comment
Кроме того, что это пустая трата памяти... почему бы и нет (кроме того, что это уродливо)? Он просто генерирует список, полный None, который затем выбрасывается, потому что он ничему не был назначен.   -  person Gillespie    schedule 20.08.2019


Ответы (3)


«polarity_scores(sentence)» Вейдера принимает строковый параметр, а не список.

Ваш код должен быть:

analyser = SentimentIntensityAnalyzer()

def print_sentiment_scores(alist):
    for aSentence in alist: 
      aSnt = analyser.polarity_scores(aSentence[0])
      print(str(aSnt))


print_sentiment_scores(your_list)

Наконец-то я заставил это работать со следующим кодом и csv:

#!/usr/bin/python3
import csv
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

with open('Before.csv', "r", errors='ignore') as f:
    reader = csv.reader(f)
    your_list = list(reader)

analyser = SentimentIntensityAnalyzer()

def print_sentiment_scores(alist):
    for aSentence in alist: 
      aSnt = analyser.polarity_scores(aSentence[0])
      print(str(aSnt))

print_sentiment_scores(your_list)

Содержимое связанного файла .csv:

['Patience and Kindness and I know they truly love and care for 
animals, my dog also enjoys the events like seeing Santa and the Easter 
Bunny'], ['They are so sweet to my pets and try to fit them into the 
schedule when needed'], ['they call and check on our pet a day or 2 after 
visit make sure we fully understand treatment before we leave'], ['every 
member of the staff understands how our pets are our family; we never feel 
rushed and always have or questions answered, and are given reassurance if 
and when needed; they are compassionate and kind, respectful and very 
caring']

Вывод: Окончательный вывод

Если вы хотите, чтобы выходные строки были отформатированы, пожалуйста, изучите форматирование строк. Или опубликуйте другой вопрос на SO, если вы не можете найти ответ.

person Matthew E. Miller    schedule 20.08.2019
comment
@Jay Taggert, что выводится при печати (your_list) - person Matthew E. Miller; 20.08.2019
comment
print(your_list) [['Терпение и Доброта, и я знаю, что они действительно любят животных и заботятся о них, моя собака также любит такие события, как встреча с Сантой и Пасхальным кроликом'], ['Они так милы с моими питомцами и стараются соответствовать их в график, когда это необходимо'], ['они звонят и проверяют нашего питомца через день или 2 после визита, чтобы убедиться, что мы полностью понимаем лечение, прежде чем мы уйдем'], ['каждый член персонала понимает, что наши питомцы - наша семья ; мы никогда не чувствуем спешки и всегда получаем ответы на вопросы, и нас подбадривают, если и когда это необходимо; они сострадательны и добры, уважительны и очень заботливы] - person Jay Taggert; 20.08.2019
comment
@JayTaggert что-то не так с инициализацией your_list. Я опубликую правильный код для установки your_list. Ваш список должен быть напечатан с другим «]» в конце. - person Matthew E. Miller; 20.08.2019
comment
aSentence по-прежнему является списком, потому что your_list — это список списков, потому что это CSV. analyser.polarity_scores(aSentence[0]) должно работать. - person Alex Hall; 20.08.2019
comment
Я хочу, чтобы ваш список выбирал CSV-файл или текстовый документ, в котором есть текст. Я не хочу вручную вставлять его для your_list. - person Jay Taggert; 20.08.2019
comment
@AlexHall ооо ... Эта отредактированная версия работает? У меня нет доступа к среде разработки. - person Matthew E. Miller; 20.08.2019
comment
@AlexHall analyser.polarity_scores(aSentence[0]) выдает TypeError: строка неподдерживаемого формата передана в список.__format__ - person Jay Taggert; 20.08.2019
comment
@JayTaggert, вы уверены, что это не проблема с оператором print.format(), попробуйте прокомментировать. - person Matthew E. Miller; 20.08.2019
comment
@ MatthewE.Miller Я прокомментировал это. но нет вывода, когда я запускаю его - person Jay Taggert; 20.08.2019
comment
@JayTaggert ну, конечно ... смысл комментирования в том, чтобы увидеть, откуда сохраняется ошибка. Итак, вы закомментировали это, и теперь ошибки нет? поэтому нам нужно изменить оператор печати. Дайте мне несколько минут, чтобы настроить среду разработки. - person Matthew E. Miller; 20.08.2019
comment
Да, нет ошибки после комментирования print({:-‹40} {}.format(aSentence, str(aSnt))) - person Jay Taggert; 20.08.2019
comment
Давайте продолжим обсуждение в чате. - person Matthew E. Miller; 20.08.2019
comment
Мэтью, не могли бы вы сказать, как я могу преобразовать вывод в csv f = open('After.csv','w') f.write(str(aSnt)) # Дайте здесь ваш текст csv. ## Python преобразует \n в os.linesep f.close() не работает - person Jay Taggert; 20.08.2019

SentimentIntensityAnalyzer.polarity_scores(text) принимает в качестве аргумента text/str. вы передаете список списков. Вероятно, вы хотите передать все содержимое файла в виде одного текста или передать каждое предложение отдельно, а не список списков.

person buran    schedule 20.08.2019
comment
Как я могу это сделать? - person Jay Taggert; 20.08.2019

Проблема заключается в вызове функции print_sentiment_scores. Переданный параметр представляет собой список. Исходя из вашего требования, я думаю, вы можете передать элементы списка, чтобы получить разделение. Split() работает со строковым типом в соответствии с документацией здесь

person Gokul Krishnan R    schedule 20.08.2019