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

How to maintain index when splitting sentences into words and reapplying sentiment polarity to each word?

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

             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

提前谢谢你。

编辑:

@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

听起来您可能想要更像这样的东西?
对于每个句子,你得到单词情感的平均值,然后将该值放入 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

这是一个简单的选择,只需使用内置的 pandas 即可解决此问题。首先剥离特殊字符。然后,将每个单词转换为一列。接下来将 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)]))