Как я могу оценить последний номер в словаре и заменить номер на текст? - PullRequest
0 голосов
/ 11 февраля 2020

Я возился с несколькими различными алгоритмами для анализа настроений в тексте. Пока что все были белки, кроме одного. Похоже, что это довольно точно.

from nltk.sentiment.vader import SentimentIntensityAnalyzer
sid = SentimentIntensityAnalyzer()
df['sentiment'] = df['review_text'].apply(lambda x: sid.polarity_scores(x))

Это дает мне результаты словаря, например:

{'neg': 0.315, 'neu': 0.593, 'pos': 0.093, 'compound': -0.7178}
{'neg': 0.215, 'neu': 0.556, 'pos': 0.229, 'compound': 0.0516}
{'neg': 0.373, 'neu': 0.133, 'pos': 0.493, 'compound': 0.2263}
{'neg': 0.242, 'neu': 0.547, 'pos': 0.211, 'compound': -0.1027}
{'neg': 0.31, 'neu': 0.69, 'pos': 0.0, 'compound': -0.6597}

Я пытаюсь выяснить, как оценить последнее число в каждом строку (-0,7178, 0,0516, 0,2263, -0,1027, -0,6597) и примените следующие логи c:

If compound <= 0 Then negative
ElseIf compound > .2 Then positive
Else neutral

Я попытался найти подстроку в словаре, например:

sub = '''compound':'''
df['Indexes'] = df['sentiment'].str.find(sub)  
df 

Я думал о поиске позиции, затем набрал последний номер и запустил логи c, описанные выше. Я начинаю думать, что это не правильный подход. Как лучше всего решить эту проблему?

Ответы [ 3 ]

1 голос
/ 11 февраля 2020
# data = df['sentiment'] I just abstracted it to data so it looks better.

data = [
{'neg': 0.315, 'neu': 0.593, 'pos': 0.093, 'compound': -0.7178},
{'neg': 0.215, 'neu': 0.556, 'pos': 0.229, 'compound': 0.0516},
{'neg': 0.373, 'neu': 0.133, 'pos': 0.493, 'compound': 0.2263},
{'neg': 0.242, 'neu': 0.547, 'pos': 0.211, 'compound': -0.1027},
{'neg': 0.31, 'neu': 0.69, 'pos': 0.0, 'compound': -0.6597}
]

def evaluate(num):
  if(num < 0):
    return 'negative'
  elif (num > 0.2):
    return 'positive'
  else:
    return "neutral"


for item in data:
  num = item['compound'];
  print(num, ' is', evaluate(num));

вывод:

-0.7178  is negative
0.0516  is neutral
0.2263  is positive
-0.1027  is negative
-0.6597  is negative
1 голос
/ 11 февраля 2020

Вы можете использовать apply(), который получает x['compound'] и конвертировать в "negative", "positive" или "neutral"

def convert(x):
    if x <= 0:
        return "negative"
    elif x > .2:
        return "positive"
    else:
        return "neutral"

df['result'] = df['sentiment'].apply(lambda x:convert(x['compound']))

Минимальный рабочий код

import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import pandas as pd

def convert(x):
    if x <= 0:
        return "negative"
    elif x > .2:
        return "positive"
    else:
        return "neutral"

sid = SentimentIntensityAnalyzer()

df = pd.DataFrame({
    'review_text': ['bad', 'ok', 'fun', 'neutral']
})

df['sentiment'] = df['review_text'].apply(lambda x: sid.polarity_scores(x))

df['result'] = df['sentiment'].apply(lambda x:convert(x['compound']))

print(df[['review_text', 'result']])

Результат

  review_text    result
0         bad  negative
1          ok  positive
2         fun  positive
3     neutral  negative
0 голосов
/ 11 февраля 2020

Это похоже на dict (), а не на str. Если это диктуете, вы можете взять ваше соединение, используйте это:

df['sentiment']['compound']

Если это str, вы можете разделить свою часть и принять последнюю часть. Пример:

df['Indexes'] = float(df['sentiment'].str.split('compound: ')[1])  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...