将句子拆分成单词并将情感极性重新应用于每个单词时,如何维护索引?

时间:2018-08-28 17:48:53

标签: python pandas indexing nlp textblob

我有一个如下所示的句子数据框:

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

我可以成功地使用TextBlob.wordshttps://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

先谢谢您。

编辑:

@kevin这是带有正确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 :(得分:1)

这里是一个简单的选择,只需使用内置的熊猫即可解决此问题。首先删除特殊字符。然后,将每个单词转换为一列。接下来,对每个单词应用TextBlob并从Blob中提取极性。最后取每一行的平均值

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)]))

答案 1 :(得分:0)

听起来像您可能想要更多类似的东西吗?
对于每个句子,您需要获取单词情感的平均值,然后将该值放入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