当前位置:   article > 正文

【文本分类】基于两种分类器实现影评的情感分析(SVM,KNN)_基于svm的文本情感分析

基于svm的文本情感分析

 

支持向量机(Support Vector Machine, SVM)

  1. 在这里插入图片描述
  2. 线性不可分时,就进行升维;接着就可以使用线性分类器
  3. 理论上来说,对任何分类问题,SVM都可以通过选择合适的核函数来完成
  4. 核函数的选择直接影响到 SVM分类性能的优劣,是设计SVM的关键问题
     
    在这里插入图片描述

 
 
 

K最邻近 (k-Nearest Neighbour,KNN)

  1. 核心思想非常简单:如果待测样本在特征空间中的k个邻居大多数属于某一个类别,则该样本也应属于这个类别——“物以类聚,人以群分
  2. k的选择极其重要:k太小,分类结果易受噪声点影响;k太大,邻居中又可能包含太多的其它类别的点
  3. 权的思想同样重要:显然离待测样本越近的邻居,越可信;密度越大的邻居,越可信
  4. 距离计算公式的选择也很重要:对于文本分类来说,使用余弦(cosine)来计算相似度就比欧式(Euclidean)距离更合适

 
 

代码

文本处理

from nltk.corpus import movie_reviews

# ([...], pos)
# ([...], neg)
documents = [(list(movie_reviews.words(fileid)), category) for category in movie_reviews.categories() for fileid in movie_reviews.fileids(category)]

# 将documents「随机化」,为组成训练集和测试集作准备
import random
random.shuffle(documents)


# 挑出词频最高的2000个词,作为「特征词」 (其实去掉停词,去掉标点符号,还剩大概1800个词)
import nltk
from nltk.corpus import stopwords
import string
word_fd = nltk.FreqDist(w.lower() for w in movie_reviews.words()).most_common(200)     # 词频最高的前2000个(词+频度)
feature_words = [w for (w, _) in word_fd if w not in stopwords.words("english") and w not in string.punctuation]    # 处理后最终的特征词列表


# 文本处理(用的是多个document文件,返回的正好是训练需要的二维数组)
import numpy as np
features = np.zeros([len(documents), len(feature_words)], dtype = float)
for i in range(len(documents)):
    document_words = set(documents[i][0])
    for j in range(len(feature_words)):
        features[i, j] = 1 if (feature_words[j] in document_words) else 0

# 文本处理函数(用来处理单个文件,返回的是个一位数组———其实是一个单行的二维数组)
def get_document_feature(document):
    document_words = set(document)
    features = np.zeros([1, len(feature_words)], dtype = float)
    for j in range(len(feature_words)):
        features[0, j] = 1 if (feature_words[j] in document_words) else 0
    return features


# document(文件)应该有2000个,去前1200作为训练集,后800作为测试集
target = [c for (d, c) in documents]
train_X = features[:1200, :]
train_Y = target[:1200]
test_X = features[1200:, :]
test_Y = target[1200:]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

 
SVM训练与测试

from sklearn import svm
classifier = svm.SVC(kernel = 'rbf')  # kernel为核函数类型,默认RBF径向基神经网络
classifier.fit(train_X, train_Y)

print('支持向量机(SVM)的测试集正确率为', classifier.score(test_X, test_Y))

text = input('请输入影评文本(一句话也行>_<): ')
print('情感分析结果为(pos/neg): ', classifier.predict(get_document_feature(text.split(' '))))
# 注意get_document_feature的参数需要是个词列表哦!因此需要提前分词,这里使用了最偷工减料的text.split(' ')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
 
KNN训练与测试

from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=7)    # 即k值(默认为5)
classifier.fit(train_X, train_Y)

print('k最邻近(KNN)的测试集正确率为', classifier.score(test_X, test_Y))

text = input('请输入影评文本(一句话也行>_<): ')
print('情感分析结果为(pos/neg): ', classifier.predict(get_document_feature(text.split(' '))))
# 注意get_document_feature的参数需要是个词列表哦!因此需要提前分词,这里使用了最偷工减料的text.split(' ')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
 
 
 
 

笔者注

  • 文本处理是最难理解的部分,一定要转变过来思维——不是将每个document(文本)中的词列表本身作为特征,而是事先规定一些特征词,用这些特征词去试探它们在document中是否存在,将存在与否作为特征——也就是说,事先规定了多少特征词,这个文本的特征就有多少个
  • 第二点,就是彻底理解上面第一点 !

 
 
 

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

闽ICP备14008679号