情感分析

  • 无权重。直接计算文本中正、负情感词出现的次数
  • 有权重。tf-idf, tf是词频,idf是权重。

Tfidf法

scikit库除了CountVectorizer类,还有TfidfVectorizer类。TF-IDF这个定义相信大家应该已经耳熟能详了:

  • TF 词语出现越多,这个词越有信息量
  • IDF 词语越少的出现在文本中,词语越有信息量。

原始数据

import pandas as pd


corpus = ["hello, i am glad to meet you",
           "it is wonderful",
           "i hate you",
           "i am sad"]

df1 = pd.DataFrame(corpus, columns=['Text'])
df1

构造tfidf

from sklearn.feature_extraction.text import TfidfVectorizer


def createDTM(corpus):
    """构建文档词语矩阵"""
    vectorize = TfidfVectorizer()
    #注意fit_transform相当于fit之后又transform。
    dtm = vectorize.fit_transform(corpus)
    #vectorize.fit(corpus)
    #dtm  = vectorize.transform(corpus) 
    #打印dtm
    return pd.DataFrame(dtm.toarray(), 
                        columns=vectorize.get_feature_names()) 

df2 = createDTM(df['text'])
df2

合并df1和df2

df = pd.concat([df1, df2], axis=1)
df

#积极词典
pos_words = ['glad', 'hello', 'wonderful']

#消极词典
neg_words = ['sad', 'hate']

#积极词典
df[pos_words]
df[pos_words].sum(axis=1)

Run

0    0.873439
1    0.577350
2    0.000000
3    0.000000
dtype: float64
df['Pos'] = df[pos_words].sum(axis=1)
df
df['Neg'] = df[neg_words].sum(axis=1)
df

输出

df.to_csv('output/tfidf有权重的情感分析.csv')

广而告之