【火炉炼AI】机器学习034-NLP对文本进行分词

部署运行你感兴趣的模型镜像

【火炉炼AI】机器学习034-NLP对文本进行分词

(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3, jieba 0.39)

分词过程可以认为是自然语言处理(NLP)的第一步,在我们获取了文本数据集后,首先要做的就是将文本句子分割成各种单词,下面介绍各种常用的分词工具。


1. 对英文进行分词

1.1 对句子进行分割–sent_tokenize

NLP可以对句子进行分割,也就将一整段文本分割成几句话,经常是以句子结尾符号为标志来分割。这些符号包括有问号,感叹号,句号等。(逗号不会分割。)如下演示代码

# 对句子进行分割(tokenization)
from nltk.tokenize import sent_tokenize
text = "Are you curious about tokenization? Let's see how it works! We need to analyze, a couple of sentences with punctuations to see it in action."
sent_list=sent_tokenize(text)
print(sent_list) # 句子结尾符号为标志分割

-------------------------------------输---------出--------------------------------

[‘Are you curious about tokenization?’, “Let’s see how it works!”, ‘We need to analyze, a couple of sentences with punctuations to see it in action.’]

--------------------------------------------完-------------------------------------

可以看出sent_tokenize以问号,感叹号,句号来分割,但是中间的逗号却留在原来的句子中,没有分割。

1.2 对句子进行分词–word_tokenize

对句子进行分词,是将一段文本,一句话或者几个单词分割成几个单独的单词,分割的依据是空格,问号,逗号,句号等符号,代码如下:

# 对句子进行分词,即根据语义将一句话分成多个单词
from nltk.tokenize import word_tokenize
text = "Are you curious about tokenization? Let's see how it works! We need to analyze, a couple of sentences with punctuations to see it in action."
word_list=word_tokenize(text)
print(word_list) # 以空格,问号,感叹号,句号等分割成单词
# 分词在NLP中非常重要,经常是NLP的第一步

-------------------------------------输---------出--------------------------------

[‘Are’, ‘you’, ‘curious’, ‘about’, ‘tokenization’, ‘?’, ‘Let’, “'s”, ‘see’, ‘how’, ‘it’, ‘works’, ‘!’, ‘We’, ‘need’, ‘to’, ‘analyze’, ‘,’, ‘a’, ‘couple’, ‘of’, ‘sentences’, ‘with’, ‘punctuations’, ‘to’, ‘see’, ‘it’, ‘in’, ‘action’, ‘.’]

--------------------------------------------完-------------------------------------

1.3 对句子进行分词–WordPunctTokenizer

WordPunctTokenizer的结果基本和上面的word_tokenize结果一致,不同的地方在于WordPunctTokenizer分词器可以将标点符号保留到不同的句子标记中。代码如下:

# 还有一个分词方法:WordPunct分词器,可以将标点符号保留到不同的句子标记中
from nltk.tokenize import WordPunctTokenizer
text = "Are you curious about tokenization? Let's see how it works! We need to analyze, a couple of sentences with punctuations to see it in action."
word_punct=WordPunctTokenizer()
word_punct_list=word_punct.tokenize(text)
print(word_punct_list)

-------------------------------------输---------出--------------------------------

[‘Are’, ‘you’, ‘curious’, ‘about’, ‘tokenization’, ‘?’, ‘Let’, “’”, ‘s’, ‘see’, ‘how’, ‘it’, ‘works’, ‘!’, ‘We’, ‘need’, ‘to’, ‘analyze’, ‘,’, ‘a’, ‘couple’, ‘of’, ‘sentences’, ‘with’, ‘punctuations’, ‘to’, ‘see’, ‘it’, ‘in’, ‘action’, ‘.’]

--------------------------------------------完-------------------------------------

通过和上面的word_tokenize结果结果进行比较可以发现,唯一的不同就是Let’s分割时不同,WordPunctTokenizer将Let’s分割为三个单词,而word_tokenize却分割成两个单词。一般情况下,这一点区别意义不大,故而word_tokenize用得跟多一些。

(注意:虽然在《Python机器学习经典实例》中提到还有一个分词器PunktWordTokenizer,但是这个分词器已经弃用了,就连import都会出错,故而此处不讲解。)

2. 对中文进行分词

上面的几个分词器对英文非常好用,但是很遗憾,对中文不能分词成功,我自己尝试过。对英文的分词很简单,因为是以空格作为自然分解符,可是中文却不是的,中文要分成单词而不是汉字。

对于中文分词,有很多种分词模块,比如:jieba、SnowNLP(MIT)、pynlpir(大数据搜索挖掘实验室(北京市海量语言信息处理与云计算应用工程技术研究中心))、thulac(清华大学自然语言处理与社会人文计算实验室)等。比较常用的是"jieba"分词器,意思就是像结巴一样结结巴巴的把一个句子分成几个单词。

jieba分词器需要单独安装,安装也很简单,直接使用pip install jieba即可。

jieba分词支持说那种分词模式:
1. 精确模式:试图将句子最精确的切开,适合于文本分析。
2. 全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但不能解决歧义。
3. 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合于搜索引擎分词,支持繁体分词。

下面分别用着三种模式来进行中文分词,比较其异同点。

# 中文分词应该使用jieba等分词模块
import jieba
text = "这是【火炉炼AI】的机器学习系列文章,本文的标题是《【火炉炼AI】机器学习034-NLP对文本进行分词》。"+ \
    "你可以从这个系列文章中学习到很多关于机器学习,人工智能方面的基础知识和实战技巧。"+\
    "请尽情享受吧!我的AI朋友们。。。"
mode1_list=jieba.cut(text,cut_all=False) # 精确模式(默认为False,精确模式)
print('jieba-精确模式结果:')
print('/'.join(mode1_list))

mode2_list=jieba.cut(text,cut_all=True) # 全模式
print('jieba-全模式结果:')
print('/'.join(mode2_list))

mode3_list=jieba.cut_for_search(text) # 搜索引擎模式
print('jieba-搜索引擎模式结果:')
print('/'.join(mode3_list))

-------------------------------------输---------出--------------------------------

这是/【/火炉/炼/AI/】/的/机器/学习/系列/文章/,/本文/的/标题/是/《/【/火炉/炼/AI/】/机器/学习/034/-/NLP/对/文本/进行/分词/》/。/你/可以/从/这个/系列/文章/中/学习/到/很多/关于/机器/学习/,/人工智能/方面/的/基础知识/和/实战/技巧/。/请/尽情/享受/吧/!/我/的/AI/朋友/们/。/。/。
jieba-全模式结果:
这/是///火炉/炼/AI//的/机器/学习/系列/文章///本文/的/标题/是////火炉/炼/AI//机器/学习/034/NLP/对/文本/进行/分词////你/可以/从/这个/系列/文章/中学/学习/到/很多/关于/机器/学习///人工/人工智能/智能/方面/的/基础/基础知识/知识/和/实战/战技/技巧///请/尽情/享受/吧///我/的/AI/朋友/们////
jieba-搜索引擎模式结果:
这是/【/火炉/炼/AI/】/的/机器/学习/系列/文章/,/本文/的/标题/是/《/【/火炉/炼/AI/】/机器/学习/034/-/NLP/对/文本/进行/分词/》/。/你/可以/从/这个/系列/文章/中/学习/到/很多/关于/机器/学习/,/人工/智能/人工智能/方面/的/基础/知识/基础知识/和/实战/技巧/。/请/尽情/享受/吧/!/我/的/AI/朋友/们/。/。/。

--------------------------------------------完-------------------------------------

从上面的输出结果可以看出,这三种方法还是有很多不同点的,比如全模式的结果都没有标点符号,而且有几个地方有重复,比如"文章中学习到"被分割成/文章/中学/学习/到/,而搜索引擎模式则对长词在此切分,所以有些地方重复,比如/人工/智能/人工智能/方面/的/基础/知识/基础知识/等。

########################小**********结###############################

1,如果想对英文进行分词,可以直接使用NLP中自带的sent_tokenize,word_tokenize,WordPunctTokenizer分词器,其中的word_tokenize是应用最频繁的。

2,如果想对中文进行分词,可以使用jieba模块,其中的精确模式(也是其默认模式)已经能够很好的将文本切分开来。其他模式在不同的应用场景中会用到。

#################################################################


注:本部分代码已经全部上传到(我的github)上,欢迎下载。

参考资料:

1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

此为学习版,请勿用于商业用途或扩散。 以下描述转至互联网。 ============== 一、CSW中分词组件简介 CSW中文分词组件,是一套可自动将一段文本按常规汉语词组进行拆分,并以指定方式进行分隔的COM组件。本组件采用独有的高效的分词引擎及拆分算法,具有准确、高速、资源占用率小等特点。为了满足客户对文本语义进行研究分析的需要,本组件同时提供词性及词频标注功能,可根据用户要求,对其拆分后的词组进行词性标注或词频标注。互联网信息检索、数据库信息查询、智能聊天机器人、文本校对、自动翻译、 自动摘要、自动分类及信息加工处理等各个领域。 二、本组件特点: 1.适应性强 本组全部件采用ANSI标准C++开发,可广泛应用于当今的操作系统平台上,如:MS Windows、Linux及其它各公司出品的Unix操作系统。 2. 支持范围广 在MS Windows平台下,本组件以COM接口的DLL格式进行封装,可支持所有支持COM接口调用的编程语言及脚本语言。如:PHP、JSP、ASP、ASP.net、C/C++ 、VC6.0 、VC.net、BC、C#、VB6.0 、VB.net、Delphi、Java等。 3. 响应速度快 由于本组件采用高效特殊的算法引擎结构,每秒钟拆分可达数万字汉语文本,在对搜索关键词进行拆分情况下,其响应时间均在数毫秒之内,为搜索提供强劲动力。 4. 词组识别准确率高 采用特殊的词组拆分识别算法,可有效消除汉语词组中汉语歧义,并可识别各个行业内的特殊用语、专用词汇、公司名、地名等,并具有汉语成语、汉语短语识别功能。如:'醉翁之意不在酒'。经长期使用及大量文本测试其准确率可达到92%以上。 5. 拆分覆盖面广 含盖了IT、化工、金融、贸易、纺织、电子、制造、冶金等各行各业以及日常生活用语中的汉语词组。 6. 提供词组自定义功能 可根据用户需要自行添加汉语词组,并提单个汉字添加或从文件批量添加功能。 7.特殊字符过滤功能 可根据用户需要自行定义影响检索结果的不必要的字符。如:! % *等。 9. 具有英文分词识别功能。 本组件同时具有英文单词的分词识别功能。 10. 词性标注功能。(限企业A版) 词性:即词组在汉语语言中所表述的性质。如:计算机 /名词; 中国 / 名词,方位词 此功能可对拆分出的汉语词组进行词性标注,辅以开发人员理解分析文本序列中所包含的语义或意图。其广泛应用于互联网信息搜索以提高搜索精度、智能聊天机器人理解对方话语的含义等领域。整个分词标注以北京大学词性标注集为标准。(详细可参见词性标注表) 11. 词频标注功能。(限企业B版) 词频:即词组在广域的所有汉语词组中出现的相对频率值。 此功能可对拆分出的汉语词组进行词频标识。为开发人员在对搜索关键词的理解分析上提供有效的参考,以提高检索精度。整个词频标识是以各大报刊媒体文章为基础,经过精心的统计分析制作而成,具有相当的参考价值。 三、在线演示/免费下载 在线演示:http://61.129.81.124/csw/csw50.asp 四、各语言调用示例代码 参数一:InputString[string类型] 需进行分词的原始文本 参数二:OutputType[int整型] 输出类型 (0 标准分词输出, 1 附带词性输出, 2 附带词频输出) 参数三:DllPath[string类型] 本组件在系统中的完整路径 返回:OutputString[string类型] 输出分词后的文本序列 1. C#调用示例代码 首先运行本组件包中的install.bat文件,在系统中注册本组件。 然后在开发工具中引用CSW.dll组件 //以下为C#控制台应用程序中调用本组件示例代码. CSWLib.SplitWordClass csw = new CSWLib.SplitWordClass(); string text = csw.Split('待拆分原始文本',0,@'c:winntsystem'); Console.WriteLine(text); Console.ReadLine(); //暂停,查看输出 访问官方网站获得更多代码示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值