使用python pandas和scikit学习情感分析

时间:2020-07-02 20:13:02

标签: python pandas scikit-learn sentiment-analysis

我有一个产品评论数据集。我想对单词进行计数,而不是对所有单词进行计数,而是想对某些特定单词(例如``惊人'',``伟大'',``爱''等)进行计数并放入现在我们的目标是创建一列product ['awesome'],其中每一行都包含相应产品在评论中出现“ awesome”一词的次数。我们将使用.apply()方法可对“ word_count”列的每一行重复上述逻辑。

首先,我们必须使用Python函数定义上述逻辑。我们必须编写一个名为awesome_count的函数,该函数接受字数统计并返回“ awesome”出现在评论中的次数。

接下来,我们必须使用.apply()对“ word_count”的每一行进行awesome_count迭代,并使用结果计数创建一个名为“ awesome”的新列。看起来像这样: 产品['awesome'] =产品['word_count']。apply(awesome_count)

任何人都可以帮助我解决上述问题的代码需求。 预先感谢。

1 个答案:

答案 0 :(得分:0)

好的,我撒了谎;对于通过语料库独立获取词频的情况,我们可以将pandas和numpy相结合,如下所示:

word_A = np.array(df.series.str.findall('word'))
getlength = np.vectorize(len)
getlength(word_A)

幕后真相:

LINE1

  • pd.series.str将系列转换为字符串;
  • str.finall()返回与列表元素匹配的所有“ pattern” 出现(findall是一个re函数);由于我们输入的是字符串,因此每次匹配时都会一遍又一遍地返回该字符串。结果将是X个列表元素,其中X是您搜索的文档数量,每个元素中单词的Y个字符串,其中Y是该文档中每次匹配时字符串的副本;

例如,如果您有3个文档,并且每个文档的“ word”都匹配以下内容:1、2、4,则列表将如下所示:

[['word'], ['word', 'word'], ['word', 'word', 'word', 'word']]
  • np.array()将列表转换为数组(因此我们可以将其向量化);

    array([list(['word']), list(['word', 'word']), list(['word', 'word', 'word', 'word'])], dtype=object)

LINE2

  • np.vectorize()使我们通过的函数成为 向量化函数 (将其用于numpy广播);

LINE3

  • 将我们的 矢量化 函数应用于数组;

在第3行中调用向量化函数(在这种情况下为len())时,它将遍历每个数组元素并应用该函数。结果是一个索引与初始文档系列匹配的数组,但包含搜索项的整数。例如:

array([ 1, 2, 4])

注意: 我仍然建议您走slightly更长的路线-至少在进行频率统计之前对数据进行预处理。

希望这会有所帮助!

更新

您想要多少个单词,您的数据集有多大?

如果您的计算机可以处理,则可以使用Sklearn的CountVectorizer将语料库转换成密集的“文档行”矩阵(文档x单词),其中每个值都是该文档中单词的频率。

从那里,您可以使用文档索引查询相对于其类别的文档,并获得所有单词的总计数。

这种方法在计算上更加严格,将需要更长的计算时间,但是如果您要从频率中获取大量的EDA,则最好是将数据存储在矩阵/帧中,如果可以存储的话。

如果您只做几个单词而又不希望做太多分析,那么每次找到单词时,我们都可以使用NumPy数组返回文档的索引位置,然后对所有返回值求和(即您搜索的文档中的词频)。

理想情况下,在汇总单词频率以及我们不希望对数据进行预处理之前(即删除非单词字符,小写,记号化,词义化等),这样可以更好地收集“特征”,即单词。 “这太神奇了!”,“我很惊讶”和“她让我惊讶”。尽管它们都以类似的方式使用,但都返回了不同的“令牌”或“惊奇”功能。

如果我们不需要进行预处理并且不需要进行很多观察或数据操作,那么我们可以进行快速排列以捕获单词。您可能仍想手动更改单词(“ Amazing-> amaz”等),将其小写并标记文档字符串。

另一种方法是将regex和.apply()与用户函数一起使用,该函数将re.findall()的返回值附加到列表中;但这在计算上效率低下,因此实际上只适合处理少于500,000个文档中的少数单词;甚至需要花费几分钟的时间,具体取决于您的处理能力。

或者您可以使用listcomp将值直接设置为单元格位置。

抱歉,我不在电脑旁;我会稍后再检查并添加一些代码。请让我进一步了解您的数据集大小。谢谢!