- 最近完成神经网络的大作业,要求使用KNN对消极和积极的英文评论进行分析,以消极和积极评论各2995条样例作为样本集进行实验,并且通过各2000条测试样例作为测试集判断准确率。
- 代码没有调用sklearn库,所有的代码都是博主手写,数据集放在了本文的最后。
- 情感分析是根据文本所表达的含义和情感信息将文本划分成褒扬和贬义两种类型。目前,比较常用的分类算法有: 支持向量机 (SVM)、 贝叶斯
(NB)、K-近邻 (KNN)等,其中 KNN 方法有着广泛的应用领域。 情感分析的步骤一般如下:
1. 文本向量化
-
文本向量化是情感分析中必须要经历的一步,为了便于计算文档之间的相似度,进行分类处理,我们需把文档转成统一空间的向量。
-
为了计算文档之间的相似度,在英文中,我们可以忽略文档内的单词顺序和语法、句法等要素,将其仅仅看作是单词的集合。在情感分析中,我们将消极语料库和积极语料库进行向量表示。
-
在文本向量化的过程中,句子中会出现停用词,所谓停用词就是非常常见且实际意义有限的词,如英文中“the”, “a”, “of”, “an”
等。这些词几乎可能出现在所有场合,因而对某些应用如信息检索、文本分类等区分度不大。所以在文本向量化的过程中,我们要将这些停用词删掉。 -
我们还需要统计单词在文本中出现的频率,即计算词条的权重。比较Tf - idf 和布尔权重两种计算词条权重的方法,发现Tf – idf
的正确率略高一点,为了节约时间成本,在这里计算权重时我们使用布尔权重法来计算。 文本向量化的步骤具体如下:- 将文件夹中的文本导入进行程序中
- 按照词对语料库进行文本的划分
- 删除文本中的停用词
- 计算词条出现的权重
-
代码如下:
# 删除停用词
def delete_stopwords(word_lst):
lst_add = ['could','will','can','would','also']
text_collection = []
wordnet_lematizer = WordNetLemmatizer() # 统一单词的形式,比如将三单原型化
new_word_lst = []
for j in range(len(word_lst)):
lst1 = []
token_words = pos_tag(word_lst[j])
for word,tag in token_words:
if word not in stopwords.words('english'): # 提取所有形容词,并且将他们统一单词的形式,比如将三单原型化
new_word = wordnet_lematizer.lemmatize(word)
lst1.append(new_word)
if new_word not in text_collection and new_word not in lst_add:
text_collection.append(new_word)
if lst1 != []:
new_word_lst.append(lst1)
return new_word_lst,text_collection
def text_CountVectorizer(new_word_lst,text_collection):
num_collection = len(text_collection)
num_text = len(new_word_lst)
array_text = np.zeros((num_text,num_collection), dtype=int)
for i in range(num_text):
for j in range(len(new_word_lst[i])):
if new_word_lst[i][j] in text_collection:
place = text_collection.index(new_word_lst[i][j])
array_text[i][place] += 1
return array_text
2. 特征选择
- 虽然我们已经删除了停用词,但在文本中还有许多与学习任务没有帮助的特征。加入这些特征会影响对文本的判断,所以我们下一步要删除这些词汇,通过降低维度来提升模型的效率。
- 常见的特征选择方法有: 方差选择法,皮尔逊相关系数法(Pearson correlation coefficient),基于森林的特征选择法,递归特征消除法。情感分析常用的两种方法是:方差选择法和皮尔森相关系数法。
2.1 方差选择法
- 原理:方差非常小的特征维度对样本的区分作用很小,因此在特征选取中我们可以剔除这些特征值。
- 方法:1. 计算每个特征的方差。2. 根据阈值,保留方差大于阈值的特征。
- 这里我们阈值选取0.001正确率最高
- 具体代码如下:
def feature_Var_selection(array_text,text_collection):
array_text_new = array_text.T
yuzhi = 0.0595
delete_lst = []
for i in range(array_text_new.shape[0]):
var_line = np.var(array_text_new[i])
if var_line < yuzhi:
delete_lst.append(i)
array_text = np.delete(array_text, delete_lst, axis=1)
lst_word = [text_collection[i] for i in range(len(text_collection)) if i not in d