机器学习

自然语言处理-Python

2018-04-23  本文已影响2人  灵妍
楔子:

为什么选择tsv?
因为tab符号在文本书写中很少使用,可以明显的将样本分割开来,但是“,”在文本中属于标点符号,容易和文本相混淆。
什么叫噪音数据?
就是与我们的目的不相干的文本,比如一个数字在好的评论和坏的评论中出现的可能性是相等的,就属于噪音数据,一个词汇所有样本中只出现了一次,也有很大的可能性属于噪音数据,在单词构成语言的国家中,会有词根的概念,我们只需要词根,实词虚词的概念,我们只需要实词。
什么是词袋?
我们在进行文本处理的时候,都会把对象放入一个词袋中,这里用的是一维词袋,就是每一个列表中只装关于评论的单词,我们对这些单词进行数据的清理,二维词袋更加复杂一些,但是精确度更高,是指多了一个列表里面装有相邻的二两单词拼在一起算作一个单词进行处理的列表,它不仅有利于单词的分析,还有利于相邻两个单词关系的分析,比如如果用一维的词袋,我们会把is not算作两个虚词剔除,然后本来是不喜欢,这里就会变成喜欢。
corpus=文集=词袋
自然语言处理的应用?
文本的分类、文本的自动翻译、文本的语法纠错。
自然语言处理的基本步骤?
导入数据,数据清理,转换成稀疏矩阵,运用算法。
先导
这里我们的得到的模型以通过输入一段评论,判断它是正面的还是负面的。

1、读取数据

代码:

# Natural Language Processing

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Restaurant_Reviews.tsv', delimiter = '\t', quoting = 3)

这里表示导入以tab为分割符的数据,并且不读取数据中的双引号。

2、初始清理

代码:

import re
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
corpus = []
for i in range(0, 1000):
    review = re.sub('[^a-zA-Z]', ' ', dataset['Review'][i])
    review = review.lower()
    review = review.split()
    ps = PorterStemmer()
    review = [ps.stem(word) for word in review if not word in set(stopwords.words('english'))]
    review = ' '.join(review)
    corpus.append(review)

说明:实际应用中我们会先清理一条评论,看效果,再运用循环结构,清理所有的样本,这样可以节省纠错的运行时间。


join.PNG
清洗前和清洗后.PNG

代码说明:
re:用于数据的清理,限制显示内容,大小写转换,利用空格作为分隔节点转换成列表等。
nltk:用于下载各个国家语言的虚词词典,以及语言的词根化。
join:字符串的一种方法,这里表示对于空字符串,我们输入一个指向字符类型数据的指针,这里输入的是一个指向装有单词的列表的指针,所以返回的是以空格为分隔符的一串单词。
代码中第一句是指我们只保留文本当中的字母,并且用空格符代替去除的数字和标点符号,如果不用空格代替,我们就会返回一段连续的字母,失去字母间的分隔符。
字符串转换成列表的目的之一是剔除多余的空格,之二是便于后续的处理。
循环语句中最长的一句是要在列表中筛选出实词并进行词根化处理。
我们最后得到的词袋是一个列表结构。

3、稀疏举矩阵转换

代码:

# Creating the Bag of Words model
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features = 1500)
X = cv.fit_transform(corpus).toarray()
y = dataset.iloc[:, 1].values
CountVectorizer.PNG

代码说明:
CountVectorizer是用于筛选出出现次数最多的1500个词根,它的功能很多,可以大小写转换去除虚词等。
将装有文本的列表转换成稀疏矩阵。作为分类模型的自变量,对于随机森林来说多维自变量是适合的,但是对于一些算法维数太多不利于显示,以后会学到主成分分析法来解决这些问题。
最后我们去数据集中找出分类结果,在Python中不存在分类因子,iloc是用于返回dataframe数据类型中的第i行。

4、朴素贝叶斯分类

代码:

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)

# Fitting Naive Bayes to the Training set
from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict(X_test)

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
测试结果.PNG

得到了训练集和测试集就很容易利用朴素贝叶斯建模。

上一篇 下一篇

猜你喜欢

热点阅读