文章目录

  • **写在前:**
  • 数据源
  • 1.数据预处理
  • 2.停用词、分词处理 、提取高频词、词袋模型进行向量化处理
  • 5.网格搜索+逻辑回归
  • **网格搜索的原理**


上面的几个步骤我参考了B站的子豪君的英文文本处理这个视频

1.数据预处理

在进行数据分析的时候首先就是先观察我们的文本,对于英文文档来说,我们只想保留英文字母,因此最简单的方法就是

  1. 使用正则表达式去除特殊字符
  2. 把大写字母转换成小写字母,因为计算机只能处理二进制语言,但是大小写虽然意思一样但是二进制却是不同的所以我们需要都小写
import pandas as pd
import re #正则表达式的模块
import warnings #消除警告
warnings.filterwarnings("ignore")
#tsv文件时\t来划分的,但是还是使用读取csv的方式
train=pd.read_csv("./labeledTrainData.tsv",sep='\t',encoding="ISO-8859-1")
train_sentence=train['review']
label=train['sentiment']
def remove_punctuation(text): 
    text=re.sub('[^a-zA-Z]',' ',text)
    words=text.lower().split()
    return ' '.join(words)
train_sentence=train_sentence.apply(remove_punctuation)

2.停用词、分词处理 、提取高频词、词袋模型进行向量化处理

为什么要把这三个板块放在一起写呢?

词袋模型word2Vec和TF-IDF(之后我也会专门出一个小节来解释这两个词向量模型)模块里面的参数本身就已经包含了停用词分词还有高频词的处理了,不需要专门拿出来进行处理。

为什么要进行停用词,分词处理呢?

stop_words:这里的停用词除了指脏话之类的,更重要的是为了让一些模型少出现a an 之类的无意义的词语,停用词我也放在我公众号上了可以自行提取
analyzer:英文是以词(word)来进行划分的,因为这里套用的是词向量模型,其实现在有更好的英文分词方式,再后文我会提到

为什么要提取高频词呢?

max_features:因为我们想要进行文本的相似度分析,从而训练模型让模型更加精准,就提取出更为排名15000的高频词来进行分析,从而让机器知道哪些是消极的哪些是积极的,过多过少都达不到训练的效果
ngram_range:ngram模型的目的就是为了不让词序混乱导致意思混淆,比如“ I love you ” 和"you love me "完全就是两个意思

向量化处理目的是为了把英文翻译成计算机能够识别的二进制语言,因此和标准话,归一化不一样,向量化是根据文本长度等来进行转换的,是文本特有的一种处理方式

from sklearn.feature_extraction.text import CountVectorizer
stop_words=open('./stopwords.txt')
cv=CountVectorizer(
        analyzer='word',
        ngram_range=(1,4),
        stop_words=stop_words,
        max_features=150000)
cv.fit(test_sentence)
test_sentence=cv.transform(test_sentence)

5.网格搜索+逻辑回归

网格搜索(之后我也会补上的!)本质上就是一个优化模型,选择最优的参数(一般是CV)但是运行速度过于缓慢,在这里我使用逻辑回归的原因是因为:

首先这是二分类,如果采用神经网络这些复杂的模型来还容易达到过度拟合的状态,不是说逻辑回归因为很简单就不好用了,在实际应用中,其实逻辑回归就能解决一大部分分类问题。
cv:交叉验证,提取最好的参数,不会导致过度拟合,一般来说再逻辑回归中就使用C和dual两个参数就够了

网格搜索的原理

在一定的区间内,通过循环遍历,尝试每一种可能性,并计算其约束函数和目标函数的值,对满足约束条件的点进行逐个比较目标函数的值,最后得到最优解的近似值。

同时为了避免初始数据的划分对结果的影响,我们需要采用交叉验证的方式来减少偶然性,一般来说网格搜索都需要和交叉验证相结合使用。

GridSearchCV( estimator,param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True,  refit=True,cv=None, verbose=0, pre_dispatch='2*n_jobs',  error_score='raise',return_train_score=True)

参数

参数解释

estimator

分类器

param_grid

值为字典或者列表,需要最优化的取值范围paramters = {‘n_estimators’:range(10,100,10)}。

scoring

准确度评价指标,默认None 这个时候就需要score函数,或者scoring=‘roc_auc’

fit_params

字典类型数据,主要用于给fit方法传递参数

n_jobs

并行数,int:个数 默认值:1

pre_dispatch

指定总共分发的并行任务数,n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次

cv

交叉验证的参数,默认None,使用三折交叉验证,制定fold数量,默认是3,也可以是yield训练/测试数据的生成器

refit

默认True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与验证集进行训练,最终用于性能评估的最佳参数模型。就是说在搜索参数结束之后,用最佳参数结果再次fit一次

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(train_sentence,label,random_state=1234)
x_train=cv.transform(x_train)
x_test=cv.transform(x_test)
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
param_grid={'C':range(1,10),
            'dual':(True,False)
            }
lr_penalty= LogisticRegression()
grid=GridSearchCV(lr_penalty,param_grid=param_grid,cv=3,n_jobs=1)
grid.fit(x_train,y_train)
lg_final=grid.best_estimator_
lr_penalty= LogisticRegression(lg_final)
lr_penalty.fit(x_train,y_train)
y_pred = lr_penalty.predict(test_sentence)
y_pred=pd.DataFrame({'id':test['id'],'label':y_pred})
y_pred.to_csv("./segment.csv")

所有代码:

import pandas as pd
import re
import warnings
warnings.filterwarnings("ignore")
train=pd.read_csv("D:\\AA\\C\\Data game\\2 cold movie\\labeledTrainData.tsv",sep='\t',encoding="ISO-8859-1")
test=pd.read_csv("D:\\AA\\C\\Data game\\2 cold movie\\test.tsv",sep='\t',encoding="ISO-8859-1")

train_sentence=train['review']
test_sentence=test['review']
label=train['sentiment']
stop_words=open('D:\\AA\C\\Data game\\1 O2O food\\stopwords.txt')
def remove_punctuation(text): 
    text=re.sub('[^a-zA-Z]',' ',text)
    words=text.lower().split()
    return ' '.join(words)
test_sentence=test_sentence.apply(remove_punctuation)
train_sentence=train_sentence.apply(remove_punctuation)

from sklearn.feature_extraction.text import CountVectorizer
cv=CountVectorizer(
        analyzer='word',
        ngram_range=(1,4),
        stop_words=stop_words,
        max_features=150000)
cv.fit(test_sentence)
test_sentence=cv.transform(test_sentence)

cv1=CountVectorizer(
        analyzer='word',
        ngram_range=(1,4),
        stop_words=stop_words,
        max_features=150000)
cv1.fit(train_sentence)


from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(train_sentence,label,random_state=1234)
x_train=cv.transform(x_train)
x_test=cv.transform(x_test)
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
param_grid={'C':range(1,10),
            'dual':(True,False)#改成[]也可以
            }
lr_penalty= LogisticRegression()
grid=GridSearchCV(lr_penalty,param_grid=param_grid,cv=3,n_jobs=1)
grid.fit(x_train,y_train)
y_pred = grid.predict(test_sentence)
y_pred=pd.DataFrame({'id':test['id'],'label':y_pred})
#test['label']=y_pred['label']
y_pred.to_csv("D:\\AA\\C\\Data game\\2 cold movie\\segment.csv")

最后的准确率是89.99