当前位置:   article > 正文

情感分析的描述、基于词袋模型和word2vec模型的情感分析实现_rbf情感分析

rbf情感分析

情感分析的描述、基于词袋模型和word2vec模型的情感分析实现

以购物评论为例:

  1. # 读入原始数据集
  2. import pandas as pd
  3. dfpos = pd.read_excel('../data/购物评论.xlsx', sheet_name='正向', header=None)
  4. dfpos['y'] = 1
  5. dfpos

  1. dfneg = pd.read_excel('../data/购物评论.xlsx', sheet_name='负向', header=None)
  2. dfneg['y'] = 0
  3. dfneg

  1. # 将正向和负向数据集进行合并,用y=0和1来区分
  2. df0 = dfpos.append(dfneg, ignore_index=True)
  3. df0

  1. # 分词和预处理
  2. import jieba
  3. cut_txt = lambda x: " ".join(jieba.lcut(x)) # 这里不做任何清理工作,以保留情感词
  4. df0['clean_txt'] = df0[0].apply(cut_txt)
  5. df0

  1. from sklearn.feature_extraction.text import CountVectorizer
  2. count_vec = CountVectorizer(min_df=5) # 出现5次以上才纳入
  3. word_mtx = count_vec.fit_transform(df0.clean_txt)
  4. word_mtx
  1. # 按照7:3的比例生成训练集和测试集
  2. from sklearn.model_selection import train_test_split
  3. x_train, x_test, y_train, y_test = train_test_split(word_mtx, df0.y, test_size=0.3) # 这里可以直接使用稀疏矩阵格式
  4. x_train[0]
  1. # 使用SVM进行建模
  2. from sklearn.svm import SVC
  3. clf = SVC(kernel='rbf', verbose=True)
  4. clf.fit(x_train, y_train) # 内存占用可能较高
  5. clf.score(x_train, y_train)

  1. # 对模型效果进行评估
  2. from sklearn.metrics import classification_report
  3. print(classification_report(y_test, clf.predict(x_test)))
clf.predict(count_vec.transform([df0.clean_txt[0]]))[0]

  1. # 模型预测
  2. import jieba
  3. def m_pred(string, count_vec, model):
  4. words = " ".join(jieba.lcut(string))
  5. words_vecs = count_vec.transform([words]) # 数据需要转换为可迭代格式
  6. result = model.predict(words_vecs)
  7. if int(result[0]) == 1:
  8. print(string, '正向情感!')
  9. else:
  10. print(string, '负向情感!')
  11. comment = '外观美观,速度也不错'
  12. m_pred(comment, count_vec, clf)
  1. comment = '总的来说,给与好评!'
  2. m_pred(comment, count_vec, clf)

【基于词袋的模型,对于复杂的情感分类还是存在问题的,还需要寻找更有的模型】

以购物评论为例:

  1. # 读入原始数据集
  2. import pandas as pd
  3. dfpos = pd.read_excel('../data/购物评论.xlsx', sheet_name='正向', header=None)
  4. dfpos['y'] = 1
  5. dfneg = pd.read_excel('../data/购物评论.xlsx', sheet_name='负向', header=None)
  6. dfneg['y'] = 0
  7. # 将正向和负向数据集进行合并,用y=0和1来区分
  8. df0 = dfpos.append(dfneg, ignore_index=True)
  9. df0

  1. # 分词和预处理, 生成list of list格式
  2. import jieba
  3. df0['cut'] = df0[0].apply(jieba.lcut)
  4. df0

  1. # 按照7:3的比例生成训练集和测试集
  2. from sklearn.model_selection import train_test_split
  3. x_train, x_test, y_train, y_test = train_test_split(df0.cut, df0.y, test_size=0.3)
  4. x_train[:2]
  1. # 设置word2vec模型
  2. from gensim.models.word2vec import Word2Vec
  3. n_dim = 300 # 指定向量维度,大样本时300-500较好
  4. w2v_model = Word2Vec(size=n_dim, min_count=10)
  5. w2v_model.build_vocab(x_train) # 生成词表
  1. # 在评论训练集上建模(大数据集时可能会花费几分钟)
  2. # 本例消耗内存较少
  3. %time w2v_model.train(x_train, total_examples=w2v_model.corpus_count, epochs=10)

  1. # 情感词向量间的相似度
  2. w2v_model.wv.most_similar('不错')
w2v_model.wv.most_similar('失望')

  1. # 生成整句向量用于情感分值预测
  2. # 对购物评价、微博等短文本而言,一般是将所有词向量的平均值作为分类算法的输入值
  3. # 生成整句所对应的所有词条的词向量矩阵
  4. print(len(df0.cut[0]))
  5. pd.DataFrame([w2v_model.wv[w] for w in df0.cut[0] if w in w2v_model.wv])

  1. # 用各个词向量直接平均的方式生成整句对应的向量
  2. def m_avgvec(words, w2v_model):
  3. return pd.DataFrame([w2v_model.wv[w] for w in words if w in w2v_model.wv]).agg('mean')
  1. # 生成建模用的矩阵,耗时较长
  2. %time train_vecs = pd.DataFrame([m_avgvec(s, w2v_model) for s in x_train])
  3. train_vecs

  1. # 情感分析模型拟合
  2. from sklearn.svm import SVC
  3. clf2 = SVC(kernel='rbf',verbose=True)
  4. clf2.fit(train_vecs, y_train) # 占用内存小于1G
  5. clf2.score(train_vecs, y_train)
  1. from sklearn.metrics import classification_report
  2. print(classification_report(y_train, clf2.predict(train_vecs))) # 此处未用验证集

  1. # 保存训练完毕的模型以便于今后使用
  2. import joblib
  3. # joblib.dump(modelname, 'filename.pkl')
  4. # modelname = joblib.load('filename.pkl')
  1. # 模型预测
  2. import jieba
  3. def m_pre(string, model):
  4. words = jieba.lcut(string)
  5. words_vecs = pd.DataFrame(m_avgvec(words, w2v_model)).T
  6. result = model.predict(words_vecs)
  7. if int(result[0]) == 1:
  8. print(string, '情感正向!')
  9. else:
  10. print(string, '情感负向!')
  11. comment = '颜色不错,喜欢这个款式,好评!'
  12. m_pre(comment, clf2)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/357790
推荐阅读
相关标签
  

闽ICP备14008679号