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

标签 python pandas indexing nlp textblob

我有一个看起来像这样的句子数据框:

             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

最佳答案

这是一个简单的选择,只需使用内置的 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)]))

关于python - 将句子拆分为单词并将情感极性重新应用于每个单词时如何维护索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52063689/

相关文章:

python - 我的函数如何知道它正在接收什么类?

python - 更新 pandas 数据框中的值

python - 在 macOS 上将 Visual Studio Code 与 Miniconda 结合使用

python - Pandas 可以同时写入同一个 CSV 文件吗?

php - 打破 Wordpress post 循环并继续它

oracle - Hive 查询语言中的主键和索引是否可行?

python - pandas 应用函数中的逻辑不符合预期

python-3.x - python Pandas 中的条件日期连接

python - 这些networkx错误表示在 Pandas 数据帧上设置过滤器后得到什么?

python - 如何根据连续天数对 DataFrame 进行索引