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

 

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

  1. 【文本分类】基于两种分类器实现影评的情感分析(SVM,KNN)_第1张图片
  2. 线性不可分时,就进行升维;接着就可以使用线性分类器
  3. 理论上来说,对任何分类问题,SVM都可以通过选择合适的核函数来完成
  4. 核函数的选择直接影响到 SVM分类性能的优劣,是设计SVM的关键问题
     
    【文本分类】基于两种分类器实现影评的情感分析(SVM,KNN)_第2张图片

 
 
 

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:]

 
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(' ')

在这里插入图片描述
 
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(' ')

在这里插入图片描述
 
 
 
 

笔者注

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

 
 
 

你可能感兴趣的:(#,NLP,自然语言处理,机器学习,SVM,KNN,分类器,nlp)