网站性能检测评分
注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
python中文叫什么
如何用Python和机器学习训练中文文本情感分类模型? 行业视频课程
利用Python机器学习框架scikit-learn,我们自己做一个分类模型,对中文评论信息做情感分析。其中还会介绍中文停用词的处理方法。
疑惑
前些日子,我在微信后台收到了一则读者的留言。
我一下子有些懵——这怎么还带点播了呢?
但是旋即我醒悟过来,好像是我自己之前挖了个坑。
之前我写过《 如何用Python从海量文本抽取主题? 》一文,其中有这么一段:
为了演示的流畅,我们这里忽略了许多细节。很多内容使用的是预置默认参数,而且完全忽略了中文停用词设置环节,因此“这个”、“如果”、“可能”、“就是”这样的停用词才会大摇大摆地出现在结果中。不过没有关系,完成比完美重要得多。知道了问题所在,后面改进起来很容易。有机会我会写文章介绍如何加入中文停用词的去除环节。
根据“自己挖坑自己填”的法则,我决定把这一部分写出来。
我可以使用偷懒的办法。
例如在原先的教程里,更新中文停用词处理部分,打个补丁。
但是,最近我发现,好像至今为止,我们的教程从来没有介绍过如何用机器学习做情感分析。
你可能说,不对吧?
情感分析不是讲过了吗?老师你好像讲过《 如何用Python做情感分析? 》,《 如何用Python做舆情时间序列可视化? 》和《 如何用Python和R对《权力的游戏》故事情节做情绪分析? 》。
你记得真清楚,提出表扬。
但是请注意,之前这几篇文章中,并没有使用机器学习方法。我们只不过调用了第三方提供的文本情感分析工具而已。
但是问题来了,这些第三方工具是在别的数据集上面训练出来的,未必适合你的应用场景。
例如有些情感分析工具更适合分析新闻,有的更善于处理微博数据……你拿过来,却是要对店铺评论信息做分析。
这就如同你自己笔记本电脑里的网页浏览器,和图书馆电子阅览室的网页浏览器,可能类型、版本完全一样。但是你用起自己的浏览器,就是比公用电脑上的舒服、高效——因为你已经根据偏好,对自己浏览器上的“书签”、“密码存储”、“稍后阅读”都做了个性化设置。
咱们这篇文章,就给你讲讲如何利用Python和机器学习,自己训练模型,对中文评论数据做情感分类。
# 数据
我的一个学生,利用爬虫抓取了大众点评网站上的数万条餐厅评论数据。
这些数据在爬取时,包含了丰富的元数据类型。
我从中抽取了评论文本和评星(1-5星),用于本文的演示。
从这些数据里,我们随机筛选评星为1,2,4,5的,各500条评论数据。一共2000条。
为什么只甩下评星数量为3的没有选择?
你先思考10秒钟,然后往下看,核对答案。
答案是这样的:
因为我们只希望对情感做出(正和负)二元分类,4和5星可以看作正向情感,1和2是负向情感……3怎么算?
所以,为了避免这种边界不清晰造成的混淆,咱们只好把标为3星的内容丢弃掉了。
整理好之后的评论数据,如下图所示。
我已经把数据放到了演示文件夹压缩包里面。后文会给你提供下载路径。
模型
使用机器学习的时候,你会遇到模型的选择问题。
例如,许多模型都可以用来处理分类问题。逻辑回归、决策树、SVM、朴素贝叶斯……具体到咱们的评论信息情感分类问题,该用哪一种呢?
幸好,Python上的机器学习工具包 scikit-learn 不仅给我们提供了方便的接口,供我们调用,而且还非常贴心地帮我们做了小抄(cheat-sheet)。
这张图看似密密麻麻,非常混乱,实际上是一个非常好的迷宫指南。其中绿色的方框,是各种机器学习模型。而蓝色的圆圈,是你做判断的地方。
你看,咱们要处理类别问题,对吧?
顺着往下看,会要求你判断数据是否有标记。我们有啊。
继续往下走,数据小于100K吗?
考虑一下,我们的数据有2000条,小于这个阈值。
接下来问是不是文本数据?是啊。
于是路径到了终点。
Scikit-learn告诉我们:用朴素贝叶斯模型好了。
小抄都做得如此照顾用户需求,你对scikit-learn的品质应该有个预期了吧?如果你需要使用经典机器学习模型(你可以理解成深度学习之外的所有模型),我推荐你先尝试scikit-learn 。
向量化
《 如何用Python从海量文本抽取主题? 》一文里,我们讲过自然语言处理时的向量化。
忘了?
没关系。
子曰:
学而时习之,不亦乐乎?
这里咱们复习一下。
对自然语言文本做向量化(vectorization)的主要原因,是计算机看不懂自然语言。
计算机,顾名思义,就是用来算数的。文本对于它(至少到今天)没有真正的意义。
但是自然语言的处理,是一个重要问题,也需要自动化的支持。因此人就得想办法,让机器能尽量理解和表示人类的语言。
假如这里有两句话:
I love the game.
I hate the game.
那么我们就可以简单粗暴地抽取出以下特征(其实就是把所有的单词都罗列一遍):
I
love
hate
the
game
对每一句话,都分别计算特征出现个数。于是上面两句话就转换为以下表格:
按照句子为单位,从左到右读数字,第一句表示为[1, 1, 0, 1, 1],第二句就成了[1, 0, 1, 1, 1]。
这就叫向量化。
这个例子里面,特征的数量叫做维度。于是向量化之后的这两句话,都有5个维度。
你一定要记住,此时机器依然不能理解两句话的具体含义。但是它已经尽量在用一种有意义的方式来表达它们。
注意这里我们使用的,叫做“一袋子词”(bag of words)模型。
下面这张图(来自 ~https://goo.gl/2jJ9Kp~ ),形象化表示出这个模型的含义。
一袋子词模型不考虑词语的出现顺序,也不考虑词语和前后词语之间的连接。每个词都被当作一个独立的特征来看待。
你可能会问:“这样不是很不精确吗?充分考虑顺序和上下文联系,不是更好吗?”
没错,你对文本的顺序、结构考虑得越周全,模型可以获得的信息就越多。
但是,凡事都有成本。只需要用基础的排列组合知识,你就能计算出独立考虑单词,和考虑连续n个词语(称作 n-gram),造成的模型维度差异了。
为了简单起见,咱们这里还是先用一袋子词吧。有空我再给你讲讲……
打住,不能再挖坑了。
中文
上一节咱们介绍的,是自然语言向量化处理的通则。
处理中文的时候,要更加麻烦一些。
因为不同于英文、法文等拉丁语系文字,中文天然没有空格作为词语之间的分割符号。
我们要先将中文分割成空格连接的词语。
例如把:
“我喜欢这个游戏”
变成:
“我 喜欢 这个 游戏”
这样一来,就可以仿照英文句子的向量化,来做中文的向量化了。
你可能担心计算机处理起中文的词语,跟处理英文词语有所不同。
这种担心没必要。
因为咱们前面讲过,计算机其实连英文单词也看不懂。
在它眼里,不论什么自然语言的词汇,都只是某种特定组合的字符串而已。
不论处理中文还是英文,都需要处理的一种词汇,叫做停用词。
中文维基百科里,是这么定义停用词的:
在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。
咱们做的,不是信息检索,而已文本分类。
对咱们来说,你不打算拿它做特征的单词,就可以当作停用词。
还是举刚才英文的例子,下面两句话:
I love the game.
I hate the game.
告诉我,哪些是停用词?
直觉会告诉你,定冠词 the 应该是。
没错,它是虚词,没有什么特殊意义。
它在哪儿出现,都是一个意思。
一段文字里,出现很多次定冠词都很正常。把它和那些包含信息更丰富的词汇(例如love, hate)放在一起统计,就容易干扰我们把握文本的特征。
所以,咱们把它当作停用词,从特征里面剔除出去。
举一反三,你会发现分词后的中文语句:
“我 喜欢 这个 游戏”
其中的“这个”应该也是停用词吧?
答对了!
要处理停用词,怎么办呢?当然你可以一个个手工来寻找,但是那显然效率太低。
有的机构或者团队处理过许多停用词。他们会发现,某种语言里,停用词是有规律的。
他们把常见的停用词总结出来,汇集成表格。以后只需要查表格,做处理,就可以利用先前的经验和知识,提升效率,节约时间。
在scikit-learn中,英语停用词是自带的。只需要指定语言为英文,机器会帮助你自动处理它们。
但是中文……
scikit-learn开发团队里,大概缺少足够多的中文使用者吧。
好消息是,你可以使用第三方共享的停用词表。
这种停用词表到哪里下载呢?
我已经帮你找到了 一个 github 项目 ,里面包含了4种停用词表,来自哈工大、四川大学和百度等自然语言处理方面的权威单位。
这几个停用词表文件长度不同,内容也差异很大。为了演示的方便与一致性,咱们统一先用哈工大这个停用词表吧。
我已经将其一并存储到了演示目录压缩包中,供你下载。
# 环境
请你先到 这个网址 下载本教程配套的压缩包。
下载后解压,你会在生成的目录里面看到以下4个文件。
下文中,我们会把这个目录称为“演示目录”。
请一定注意记好它的位置哦。
要装Python,最简便办法是安装Anaconda套装。
请到 这个网址 下载Anaconda的最新版本。
请选择左侧的 Python 3.6 版本下载安装。
如果你需要具体的步骤指导,或者想知道Windows平台如何安装并运行Anaconda命令,请参考我为你准备的 视频教程 。
打开终端,用cd命令进入演示目录。如果你不了解具体使用方法,也可以参考 视频教程 。
我们需要使用许多软件包。如果每一个都手动安装,会非常麻烦。
我帮你做了个虚拟环境的配置文件,叫做environment.yaml ,也放在演示目录中。
请你首先执行以下命令:
conda env create -f environment.yaml
这样,所需的软件包就一次性安装完毕了。
之后执行,
source activate datapy3
进入这个虚拟环境。
注意一定要执行下面这句:
python -m ipykernel install --user --name=datapy3
只有这样,当前的Python环境才会作为核心(kernel)在系统中注册。
确认你的电脑上已经安装了 Google Chrome 浏览器。如果没有安装请到这里 下载 安装。
之后,在演示目录中,我们执行:
jupyter notebook
Google Chrome会开启,并启动 Jupyter 笔记本界面:
你可以直接点击文件列表中的demo.ipynb文件,可以看到本教程的全部示例代码。
你可以一边看教程的讲解,一边依次执行这些代码。
但是,我建议的方法,是回到主界面下,新建一个新的空白 Python 3 (显示名称为datapy3的那个)笔记本。
请跟着教程,一个个字符输入相应的内容。这可以帮助你更为深刻地理解代码的含义,更高效地把技能内化。
准备工作结束,下面我们开始正式输入代码。
代码
我们读入数据框处理工具pandas。
import pandas as pd
利用pandas的csv读取功能,把数据读入。
注意为了与Excel和系统环境设置的兼容性,该csv数据文件采用的编码为GB18030。这里需要显式指定,否则会报错。
df = pd.read_csv('data.csv', encoding='gb18030')
我们看看读入是否正确。
df.head()
前5行内容如下:
看看数据框整体的形状是怎么样的:
df.shape
(2000, 2)
我们的数据一共2000行,2列。完整读入。
我们并不准备把情感分析的结果分成4个类别。我们只打算分成正向和负向。
这里我们用一个无名函数来把评星数量>3的,当成正向情感,取值为1;反之视作负向情感,取值为0。
def make_label(df): df["sentiment"] = df["star"].apply(lambda x: 1 if x>3 else 0)
编制好函数之后,我们实际运行在数据框上面。
make_label(df)
看看结果:
df.head()
从前5行看来,情感取值就是根据我们设定的规则,从评星数量转化而来。
下面我们把特征和标签拆开。
X = df[['comment']]y = df.sentiment
X 是我们的全部特征。因为我们只用文本判断情感,所以X实际上只有1列。
X.shape
(2000, 1)
而y是对应的标记数据。它也是只有1列。
y.shape
(2000,)
我们来看看 X 的前几行数据。
X.head()
注意这里评论数据还是原始信息。词语没有进行拆分。
为了做特征向量化,下面我们利用结巴分词工具来拆分句子为词语。
import jieba
我们建立一个辅助函数,把结巴分词的结果用空格连接。
这样分词后的结果就如同一个英文句子一样,单次之间依靠空格分割。
def chinese_word_cut(mytext): return " ".join(jieba.cut(mytext))
有了这个函数,我们就可以使用 apply 命令,把每一行的评论数据都进行分词。
X['cutted_comment'] = Xment.apply(chinese_word_cut)
我们看看分词后的效果:
X.cutted_comment[:5]
单词和标点之间都用空格分割,...
Python中文乱码?输出中文乱码?我公司那批本科生也是!乱码攻略 流量视频课程
乱码这个问题可谓是难倒了许多的小白啊!其实乱码并不难解决,只是你得有个乱码解决的攻略,今天教你这个方法希望以后在也不会碰到这种情况了哈!
1.在Python中使用中文
1.UNICODE (UTF8-16), C854;
2.UTF-8, E59388;
3.GBK, B9FE。
1.1Windows控制台
1.2Windows IDLE(在Shell上运行)
1.3在IDLE上运行代码
1.4Windows Eclipse
在Eclipse中处理中文更加困难,因为在Eclipse中,编写代码和运行代码属于不同的窗口,而且他们可以有不同的默认编码。对于如下代码:
前四个print运行正常,最后两个print都会抛出异常:
可以看出Eclipse控制台的缺省编码方式是GBK;所以不支持UNICODE也在情理之中。如果把文件中的coding修改成GBK,则可以直接打印GBK编码的str对象,比如s。
1.5从文件读取中文
在window下面用记事本编辑文件的时候,如果保存为UNICODE或UTF-8,分别会在文件的开头加上两个字节
“/xFF/xFE”和三个字节“/xEF/xBB/xBF”。在读取的时候就可能会遇到问题,但是不同的环境对这几个多于字符的处理也不一样。
打开unicode格式的文件后,得到的字符串正确。这时候适用utf-16解码,能得到正确的unicdoe对象,可以直接使用。多余的那个填充字符在进行转换时会被过滤掉。
打开ansi格式的文件后,没有填充字符,可以直接使用。
结论:读写使用python生成的文件没有任何问题,但是在处理由notepad生成的文本文件时,如果该文件可能是非ansi编码,需要考虑如何处理填充字符。
1.6在数据库中使用中文
1.7在XML中使用中文
使用xml.dom.minidom和MySQLdb类似,对生成的dom对象调用toxml方法得到的是unicode对象。如果希望输出utf-8文本,有两种方法:
1.使用系统函数
2.自己编码生成
通过阅读这篇文章是否有解决你现在所遇到的难题呢?
python opencv在图像上书写并显示中文的好方法 行业视频课程
大家在使用python的cv2库处理图像时经常会有需要在图像的某处输出一些文字,常用的方法是利用cv2.putText函数在图像某个坐标位置添加文字,但是这个函数无法输出utf-8类型的字符,因此只能输出英文或者数字而无法直接在图像中添加中文描述。用百度搜这个问题常见的解决办法是利用freetype来解决,但是这种办法需要将字符编码解码比较麻烦,这里推荐一个简单的在图像中添加中文的办法:利用PIL的image函数在图像中添加中文,然后再转回cv2的格式。
百度搜索结果
实现过程
这里为了方便以从网络上随便下载的头条logo图像为例,图像如下:
这里默认运行环境是python3,首先需要下载中文支持的相关字体,这里我下载了黑体中文字体simhei.ttf,百度搜索即可找到下载资源。将字体放在磁盘中某个事先指定的位置。
安装相关包,需要import的有以下库
除了cv2,还需要安装PIL和numpy两个库,都是pip install 即可完成安装。
上图第一句是读入图像,这里函数第一个参数是图像位置,根据具体放的位置修改就好。 第二句是将图像转到Image格式。第三句建立一个draw对象用来画图或者添加文字,最后一句加载字体,这里同样将路径修改为实际放的位置即可。50是字的大小,根据实际情况调整,这里我为了显示明显设置的比较大。
接下来就可以添加文字了,draw.text函数在图像数组中加入文字,(0,0)是插入文字的坐标,根据实际情况调整。‘今日头条’是插入的具体文字内容,(0,0,0)是文字的颜色,这里使用了全0的黑色为例。
最后将图像变换为cv2的array格式,保存图像,打开图像如下图,可以看出图像左上角已经成功添加了中文文字。
机器学习:聊聊Python中文文本分析利器(自然语言处理)——Jieba 公司视频课程
前言
在自然语言处理领域中,分词和提取关键词都是对文本处理时通常要进行的步骤。用Python语言对英文文本进行预处理时可选择NLTK库,中文文本预处理可选择jieba库。当然也有其他好用的库,个人在中文预处理时经常使用jieba库,所以聊聊jieba库对中文预处理的一些总结。
Jieba
“结巴”中文分词是国人做的一个Python中文分词库,它支持繁体分词和自定义词典,主要有三种分词模式:
1.精确模式:试图将句子最精确地切开,适合文本分析;
2.全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
3.搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
安装
1.pip安装
pip install jieba
2.python setup install
先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
内置算法
基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG);
采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合;
对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法。
分词
jieba.cut:方法接受三个输入参数: 需要分词的字符串,cut_all 参数用来控制是否采用全模式,HMM 参数用来控制是否使用 HMM 模型;
jieba.cut_for_search:方法接受两个参数:需要分词的字符串,是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8;
jieba.cut(jieba.cut_for_search):返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode);
jieba.lcut(jieba.lcut_for_search):直接返回 list;
jieba.Tokenizer(dictionary=DEFAULT_DICT):新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
代码示例
关键词提取
1.基于 TF-IDF 算法的关键词抽取(import jieba.analyse)
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()) # 提取关键词
sentence 为待提取的文本;
topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20;
withWeight 为是否一并返回关键词权重值,默认值为 False;
allowPOS 仅包括指定词性的词,默认值为空,即不筛选。
2.基于TextRank算法的关键词
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) # 提取关键词,接口相同,注意默认过滤词性。
算法基本思路:
将待抽取关键词的文本进行分词;
以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图;
计算图中节点的PageRank,注意是无向带权图。
词性标注
1.jieba.posseg.POSTokenizer(tokenizer=None)新建自定义分词器。tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。
2.jieba.posseg.dt 为默认词性标注分词器。标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
总结
实际上用Python在做一些小文本的中文预处理时,Jieba的效果还是不错。也有跟Java的AnsjSeg相比后,小样本的处理下实际运行速度也差不了多少,主要在编程的时候方便,几行代码可以完成大量工作,大家在做文本处理时可以尝试使用下。
Python中文乱码?输出中文乱码?我公司那批本科生也是!乱码攻略 行业视频课程
乱码这个问题可谓是难倒了许多的小白啊!其实乱码并不难解决,只是你得有个乱码解决的攻略,今天教你这个方法希望以后在也不会碰到这种情况了哈!
1.在Python中使用中文
1.UNICODE (UTF8-16), C854;
2.UTF-8, E59388;
3.GBK, B9FE。
1.1Windows控制台
1.2Windows IDLE(在Shell上运行)
1.3在IDLE上运行代码
1.4Windows Eclipse
在Eclipse中处理中文更加困难,因为在Eclipse中,编写代码和运行代码属于不同的窗口,而且他们可以有不同的默认编码。对于如下代码:
前四个print运行正常,最后两个print都会抛出异常:
可以看出Eclipse控制台的缺省编码方式是GBK;所以不支持UNICODE也在情理之中。如果把文件中的coding修改成GBK,则可以直接打印GBK编码的str对象,比如s。
1.5从文件读取中文
在window下面用记事本编辑文件的时候,如果保存为UNICODE或UTF-8,分别会在文件的开头加上两个字节
“/xFF/xFE”和三个字节“/xEF/xBB/xBF”。在读取的时候就可能会遇到问题,但是不同的环境对这几个多于字符的处理也不一样。
打开unicode格式的文件后,得到的字符串正确。这时候适用utf-16解码,能得到正确的unicdoe对象,可以直接使用。多余的那个填充字符在进行转换时会被过滤掉。
打开ansi格式的文件后,没有填充字符,可以直接使用。
结论:读写使用python生成的文件没有任何问题,但是在处理由notepad生成的文本文件时,如果该文件可能是非ansi编码,需要考虑如何处理填充字符。
1.6在数据库中使用中文
1.7在XML中使用中文
使用xml.dom.minidom和MySQLdb类似,对生成的dom对象调用toxml方法得到的是unicode对象。如果希望输出utf-8文本,有两种方法:
1.使用系统函数
2.自己编码生成
通过阅读这篇文章是否有解决你现在所遇到的难题呢?