【火炉炼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著,陶俊杰,陈小莉译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值