Как сохранить индекс, разбивая предложения на слова и повторно применяя полярность чувств к каждому слову? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть дата-кадр предложений, который выглядит следующим образом:

             text
0  this is great!
1  how dare you?!

Я могу успешно использовать TextBlob.words (https://textblob.readthedocs.io/en/dev/quickstart.html#tokenization), чтобы разбить каждое предложение на отдельные слова.

Примером будет

a = TextBlob('moon is big')
print(a)

WordList(['moon','is','big'])

WordList создает тип списка blob.Wordlist, который сохраняет каждое слово.

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

for i in df.text:
    d = TextBlob(i)
    words_list=d.words 

Чтобы понять настроение каждого слова, мне нужно повторно применить TextBlob к каждому слову. Я могу сделать это с помощью приведенного ниже кода и добавить оценку полярности в список.

lst=[]
for i in text.text:
    d = TextBlob(i)
    words_list=d.words
    for i in words_list:
        f = TextBlob(i)
        print(f.sentiment)
        lst.append(f.sentiment.polarity)

На данный момент я не знаю, какая оценка полярности принадлежит какому предложению, потому что моя цель состоит в том, чтобы я хотел усреднить оценку полярности каждого слова в каждой строке кадра данных и создать новый столбец score. Можно ли в любом случае передать индекс для blob.Wordlist, чтобы я мог сопоставить среднее значение с фреймом данных?

код до сих пор:

from textblob import TextBlob
import pandas as pd
import statistics as s

df = pd.DataFrame({'text':['this is great!','how dare you?!']})

lst=[]
for i in text.text:
    d = TextBlob(i)
    words_list=d.words
    for i in words_list:
        f = TextBlob(i)
        print(f.sentiment)
        lst.append(f.sentiment.polarity)
        for i in lst:
            z = s.mean(lst)
            df['score'] = z

Новый df должен выглядеть так:

             text     score
0  this is great!  0.2
1  how dare you?!  0.3

НЕ

             text     score
0  this is great!  0.133333
1  how dare you?!  0.133333

Заранее спасибо.

редактирование:

@ Кевин, вот ваш код с правильными именами df

from textblob import TextBlob
import pandas as pd
import statistics as s

df = pd.DataFrame({'text':['this is great!','how dare you?!']})
df['score'] = 0

for j in range(len(df.text)):
    lst=[]
    i = df.text[j]
    d = TextBlob(i)
    words_list=d.words
    for i in words_list:
        f = TextBlob(i)
        print(f.sentiment)
        lst.append(f.sentiment.polarity)
    z = s.mean(lst)
    df['score'][j] = z

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Простой вариант здесь, просто используйте встроенные панды, чтобы решить эту проблему. Первая полоса спецсимволов. Затем преобразуйте каждое слово в столбец. Затем примените TextBlob к каждому слову и извлеките полярность из капли. Наконец, возьмите среднее значение каждой строки

df['Socre'] = df.text.str.replace(r"[^\w\s]+","").str.split(" ",expand=True)\
              .applymap(lambda x: TextBlob(x).sentiment.polarity).mean(1)

Редактировать - Приведенное выше решение будет работать только для предложений одинаковой длины, используйте это для общего случая

import numpy as np

df['Score'] = df.text.apply(lambda x: np.mean(
              [TextBlob(r[0]).sentiment.polarity for r in TextBlob(x).ngrams(1)]))
0 голосов
/ 28 августа 2018

звучит так, как будто вы хотите что-то еще подобное?
Для каждого предложения вы получаете среднее значение слова-чувства, а затем помещаете это значение в DF.

from textblob import TextBlob
import pandas as pd
import statistics as s

df = pd.DataFrame({'text':['this is great!','how dare you?!']})
df['score'] = 0

for j in range(len(text.text)):
    lst=[]
    i = text.text[j]
    d = TextBlob(i)
    words_list=d.words
    for i in words_list:
        f = TextBlob(i)
        print(f.sentiment)
        lst.append(f.sentiment.polarity)
    z = s.mean(lst)
    df['score'][j] = z
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...