Как мы можем провести анализ настроения и создать запись «настроения» рядом с каждой строкой текста? - PullRequest
0 голосов
/ 08 февраля 2020

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

import nltk
nltk.download('vader_lexicon')
nltk.download('punkt')

# first, we import the relevant modules from the NLTK library
from nltk.sentiment.vader import SentimentIntensityAnalyzer

# next, we initialize VADER so we can use it within our Python script
sid = SentimentIntensityAnalyzer()

# the variable 'message_text' now contains the text we will analyze.
message_text = '''Like you, I am getting very frustrated with this process. I am genuinely trying to be as reasonable as possible. I am not trying to "hold up" the deal at the last minute. I'm afraid that I am being asked to take a fairly large leap of faith after this company (I don't mean the two of you -- I mean Enron) has screwed me and the people who work for me.'''

print(message_text)

# Calling the polarity_scores method on sid and passing in the message_text outputs a dictionary with negative, neutral, positive, and compound scores for the input text
scores = sid.polarity_scores(message_text)

# Here we loop through the keys contained in scores (pos, neu, neg, and compound scores) and print the key-value pairs on the screen
for key in sorted(scores):
        print('{0}: {1}, '.format(key, scores[key]), end='')

Это дает мне:

compound: -0.3804, neg: 0.093, neu: 0.836, pos: 0.071, 

Теперь я пытаюсь вставить свой собственный столбец текста из фрейма данных.

Пример кода взят с этого сайта.

https://programminghistorian.org/en/lessons/sentiment-analysis

У меня есть поле в кадре данных, состоящее из текста, например:

These brush heads are okay!  Wish they came in a larger diameter, would cover more facial surface area and require less time to do the job!  However, I think they do a better job than just a face cloth in cleansing the pores.  I would recommend this product!
No opening to pee with. weird.  And really tight.  not very comfortable.
I choose it as spare parts always available and I will buy it again for sure!I will recommend it, without doubt!
love this cleanser!!
Best facial wipes invented!!!!!!(:

Это 5 отдельных записей из моего фрейма данных. Я пытаюсь придумать способ оценить каждую запись как «положительную», «отрицательную» или «нейтральную» и поместить каждое настроение в новое поле в той же строке.

В этом примере Я думаю, что эти 5 записей имеют следующие 5 настроений (в поле рядом с каждой записью):

neutral
negative
positive
positive
positive

Как я могу это сделать?

Я придумал альтернативную выборку из код, как показано ниже.

event_dictionary ={scores["compound"] >= 0.05 : 'positive', scores["compound"] <= -0.05 : 'negative', scores["compound"] >= -0.05 and scores["compound"] <= 0.05 : 'neutral'} 
#message_text = str(message_text)
for message in message_text:
    scores = sid.polarity_scores(str(message))
    for key in sorted(scores):
        df['sentiment'] = df['body'].map(event_dictionary) 

Это длилось около 15 минут, затем я отменил его и увидел, что на самом деле он вообще ничего не делал. Я хочу добавить поле с именем «sentiment» и заполнить его «положительным», если показатели [«составные»]> = 0,05, «отрицательными», если показатели [«составные»] <= -0,05, и «нейтральными», если показатели [ «соединение»]> = -0,05 и баллы [«соединение»] <= 0,05. </p>

1 Ответ

1 голос
/ 08 февраля 2020

Не уверен, как выглядит этот фрейм данных, но вы можете использовать Sentiment Intensity Analyzer для каждой из строк, чтобы вычислить оценки полярности каждого сообщения. Согласно странице github, вы можете использовать «составной» ключ для расчета настроения сообщения.

https://github.com/cjhutto/vaderSentiment#about -счет

messages = [
"These brush heads are okay!  Wish they came in a larger diameter, would cover more facial surface area and require less time to do the job!  However, I think they do a better job than just a face cloth in cleansing the pores.  I would recommend this product!",
"No opening to pee with. weird.  And really tight.  not very comfortable.",
"I choose it as spare parts always available and I will buy it again for sure!I will recommend it, without doubt!",
"love this cleanser!!",
"Best facial wipes invented!!!!!!(:"]

for message in messages:
    scores = sid.polarity_scores(message)

    for key in sorted(scores):
        print('{0}: {1} '.format(key, scores[key]), end='')

    if scores["compound"] >= 0.05:
        print("\npositive\n")

    elif scores["compound"] <= -0.05:
        print("\nnegative\n")
    else:
        print("\nneutral\n")

Выход:

compound: 0.8713 neg: 0.0 neu: 0.782 pos: 0.218
positive

compound: -0.7021 neg: 0.431 neu: 0.569 pos: 0.0
negative

compound: 0.6362 neg: 0.0 neu: 0.766 pos: 0.234
positive

compound: 0.6988 neg: 0.0 neu: 0.295 pos: 0.705
positive

compound: 0.7482 neg: 0.0 neu: 0.359 pos: 0.641
positive
...