热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

英文评论机器学习_第72集python机器学习:停用词和tfidf缩放数据用于电影评论...

停用词是一种删除没有信息量的单词的一种方法,该方法就是舍弃那些出现次数太多以至于没有信息量的次。主要有两种方法:使用特定语言的停用词(stopword)

停用词是一种删除没有信息量的单词的一种方法,该方法就是舍弃那些出现次数太多以至于没有信息量的次。主要有两种方法:使用特定语言的停用词(stopword)列表或舍弃那些出现过于频繁的单词

在scikit-learn的feature-extraction模块中提供了英语停用词的内置列表,代码示例如下:

from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS

print("Number of stop word: {}".format(len(ENGLISH_STOP_WORDS)))

print("Every 10th stopword:{}".format(list(ENGLISH_STOP_WORDS)[::10]))

运行上述代码其结果为:

Number of stop word: 318

Every 10th stopword:

['mine', 'meanwhile', 'again', 'across', 'off', 'though', 'such', 'something', 'myself', 'if', 'noone', 'call', 'been', 'interest', 'whose', 'behind', 'fifteen', 'even', 'often', 'found', 'sometime', 'done', 'alone', 'they', 'forty', 'last', 'co', 'part', 'whenever', 'somewhere', 'anything', 'anyhow']

由上述运行结果可知,删除上述列表中的停用词只能使得特征数量少了318个(即上述列表的长度),下面我们来看一下是否对性能产生影响。代码如下:

#指定stop_words=“English”将使用内置列表

#也可以扩展这个列表并传入自己的列表

from sklearn.feature_extraction.text import CountVectorizer

from sklearn.model_selection import GridSearchCV

from sklearn.linear_model import LogisticRegression

param_grid = {'C':[0.001,0.01,0.1,1,10,100]}

vect = CountVectorizer(min_df=10, stop_words="english").fit(text_train)

x_train = vect.transform(text_train)

print("x_train with stop words:{}".format(repr(x_train)))

grid = GridSearchCV(LogisticRegression(), param_grid, cv=5)

grid.fit(x_train, y_train)

print("Best coss validation score is: {:.3f}".format(grid.best_score_))

运行后其对应的结果如下:

x_train with stop words:

<75000x31610 sparse matrix of type &#39;&#39;

with 6538340 stored elements in Compressed Sparse Row format>

Best coss validation score is: 0.713

使用停用词偶网格搜索性能有所下降&#xff0c;但是鉴于3万多个数据减少300多个数据不太可能对性能或解释造成很大影响&#xff0c;所以这个列表似乎是不值得的&#xff0c;固定的列表主要对小型数据很有帮助&#xff0c;这些数据集可能没有包含足够的信息&#xff0c;模型从数据本身无法判断哪些单词是停用词。

下面我们通过设置CountVectorizer的max_df选项来舍弃出现最频繁的单词&#xff0c;并查看其对特征数量和性能有什么影响。

用tf_idf缩放数据&#xff1a;另一种删除没有信息量的单词(也是最常用的方法)是词频-逆向文档频率(tf-idf)方法&#xff0c;该方法对在某个特定文档中经常出现的术语给予很高的权重&#xff0c;但对于在语料库的许多文档中经常出现的术语给予的权重却不高。

如果一个单词在某个特定文档中经常出现&#xff0c;但是在许多文档中却不常出现&#xff0c;那么这个单词很可能是对文档的很好描述。scikit-learn在两个类中实现了td-idf的方法——TfidfTransform和TfidfVectorizer。前者接受CountVectorizer生成的稀疏矩阵并将其变换&#xff0c;后者接受文本数据并完成词袋特征提取和tf-idf变换。

由于tf-idf实际上利用了训练数据的统计学属性&#xff0c;所以我们将使用管道以确保网格搜索结果有效&#xff0c;对应代码如下&#xff1a;

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.pipeline import make_pipeline

pipe &#61; make_pipeline(TfidfVectorizer(min_df&#61;5),LogisticRegression())

#对于高维稀疏数据&#xff0c;类似于LogisticRegression的线性模型通常效果最好

param_grid &#61; {&#39;logisticregression__C&#39;:[0.001, 0.01, 0.1, 1, 10],

&#39;tfidfvectorizer__ngram_range&#39;:[(1,1),(1,2),(1,3)]}

#首先需要用一个字典指定要搜索的参数&#xff0c;字典的键是我们要调节的参数名称

grid &#61; GridSearchCV(pipe, param_grid, cv&#61;5)#cv&#61;5,分层k折交叉验证中k取值为5

grid.fit(text_train, y_train)

#grid对象的行为就像一个分类器&#xff0c;我们可以对它调用标准的fit、predict、score方法

#调用fit时&#xff0c;对我们指定的所有参数组合都运行交叉验证

#拟合fit对象不仅会搜索最佳参数&#xff0c;还会利用得到的最佳验证性能的参数在整个训练数据集上自动拟合一个新模型

#可以用predict、score方法来访问重新训练过的模型

#我们找到的参数保存在best_params_中

#交叉验证的最佳精度保存在best_score_中

print("Best cross-validation score:{:.3f}".format(grid.best_score_))

运行上述代码后结果为&#xff1a;

Best cross-validation score:0.723

从运行结果可以看出&#xff0c;使用tf-idf替代仅统计词数对性能有所提高&#xff0c;同时要注意的是tf-idf可以查看找到的最重要的单词&#xff0c;其缩放目的是找到能够区分文档的单词&#xff0c;但是它完全是一种无监督技术。因此&#xff0c;这里的“重要”不一定是我们所需要的“正面评论”和“负面评论”标签相关&#xff0c;所以我们还需要进行如下操作&#xff1a;

首先&#xff0c;从管道中提取TfidfVectorizer&#xff1a;

vectorizer &#61; grid.best_estimator_.named_steps["tfidfvectorizer"]

x_train&#61;vectorizer.transform(text_train)

#变换训练数据集&#xff0c;并找到数据集中每个特征的最大值

max_value &#61; x_train.max(axis&#61;0).toarray().ravel()

sorted_by_tfidf &#61; max_value.argsort()

#获取特征名称

feature_names &#61; np.array(vectorizer.get_feature_names())

print(&#39;Features with lowest tfidf:{}&#39;.format(feature_names[sorted_by_tfidf[:20]]))

print(&#39;Features with highest tfidf:{}&#39;.format(feature_names[sorted_by_tfidf[-20:]]))

#下面是找出逆向文档频率较低的词——出现次数很多&#xff0c;但是被认为不那么重要的单词

#这些词被保存在idf_属性中

sorted_by_idf&#61;np.argsort(vectorizer.idf_)

print(&#39;Feature with lowest idf:{}&#39;.format(feature_names[sorted_by_idf[:100]]))

运行结果如下&#xff1a;

d804006189d414e92fcf9b48d501d752.png

tf-idf 对应的各种特征

tf-idf较小的特征要么在很多文档里都很常用&#xff0c;要么就是很少使用&#xff0c;且仅出现在非常长的文档中。而tf-idf叫他的特征实际上对应的是特定的电影或演出中。而在lowest idf中表现出来的是对应的停用词。

接着我们来看一下这些评估分数对应的热图&#xff0c;对应代码如下&#xff1a;

scores&#61;grid.cv_results_[&#39;mean_test_score&#39;].reshape(-1,3).T

#获取对应热图

heatmap&#61;mglearn.tools.heatmap(

scores,xlabel&#61;&#39;C&#39;,ylabel&#61;&#39;ngram_range&#39;,cmap&#61;&#39;viridis&#39;,fmt&#61;&#39;%.3f&#39;,

xticklabels&#61;param_grid[&#39;logisticregression__C&#39;],

yticklabels&#61;param_grid[&#39;tfidfvectorizer__ngram_range&#39;]

)

plt.colorbar(heatmap)

91c3c7fcf60a4b303fe3ad925778ecb1.png

ngram_range和C参数控制下的预测分数热图




推荐阅读
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
author-avatar
尜艾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有