使用nltk处理中文语料(1)- 统计相关

1、概述

nltk作为自然语言处理(nlp)领域里经常被使用的一款工具。本身自带的语料大部分是英文的,其实跟对中文文档,稍作处理之后也是可以使用的,这里主要介绍nlp在中文领域的基础应用。

2、nltk安装

关于nltk的安装网上有很多的文章介绍,可以使用pip install nltk 命令非常方便的安装nltk。一般在安装完成之后需要使用download命令来下载相关的语料库,这些语料库是官方自带的,大部分是英文语料。很多nltk的教程都是基于这些语料来做的。在执行download命令时,可以由于网络环境的原因下载失败,此时可以从网上下载语料,放在环境变量所制定的文件中,就可以加载使用了。可以从下面连接下载语料:

http://pan.baidu.com/s/1hswoU5u

可以将下载的语料解压之后,放在下面目录中的任何一个就可以了:

  • ~/nltk_data 
  • /usr/share/nltk_data
  • /usr/local/share/nltk_data
  • /usr/lib/nltk_data
  • /usr/local/lib/nltk_data

注意:这里“~”代表用户所在的主目录

3、加载中文语料

nltk自带了很多统计的功能,但针对中文来讲,分词的工作需要我们手动完成。然后再把处理过的文本封装成nltk的“text”对象。然后才能使用nltk进行处理。

3.1 使用结巴进行分词

分词的目的是为nltk的text对象提供封装的语料,所以我们使用结巴分词的lcut方法进行分词,该方法与cut方法不同,返回的分词是一个list对象请参照下面代码:

import jieba
wordlist = jieba.lcut("盗墓不是请客吃饭,不是做文章,不是绘画绣花,不能那样雅致,那样从容不迫,文质彬彬,那样温良恭俭让,盗墓是一门技术,一门进行破坏的技术。古代贵族们建造坟墓的时候,一定是想方设法的防止被盗,故此无所不用其极,在墓中设置种种机关暗器,消息埋伏,有巨石、流沙、毒箭、毒虫、陷坑等等数不胜数。到了明代,受到西洋奇技淫巧的影响,一些大墓甚至用到了西洋的八宝转心机关,尤其是清代的帝陵,堪称集数千年防盗技术于一体的杰作,大军阀孙殿英想挖开东陵用里面的财宝充当军饷,起动大批军队,连挖带炸用了五六天才得手,其坚固程度可想而知。盗墓贼的课题就是千方百计的破解这些机关,进入墓中探宝。不过在现代,比起如何挖开古墓更困难的是寻找古墓,地面上有封土堆和石碑之类明显建筑的大墓早就被人发掘得差不多了,如果要找那些年深日深藏于地下,又没有任何地上标记的古墓,那就需要一定的技术和特殊工具了,铁钎、洛阳铲、竹钉,钻地龙,探阴爪,黑折子等工具都应运而生,还有一些高手不依赖工具,有的通过寻找古代文献中的线索寻找古墓,还有极少数的一些人掌握秘术,可以通过解读山川河流的脉象,用看风水的本领找墓穴,我就是属于最后这一类的,在我的盗墓生涯中踏遍了各地,其间经历了很多诡异离奇的事迹,若是一件件的表白出来,足以让观者惊心,闻者乍舌,毕竟那些龙形虎藏、揭天拔地、倒海翻江的举动,都非比寻常。")
print(wordlist)

输出效果如下图所示:

在上面的输出结果中,我们分词有很多标点符号在里边,此时我们可以使用停止词来去掉不需要词,这里我们采用简单粗暴的一种方式来处理我们只保留中文。请参考下面代码:

import re
word="盗墓不是请客吃饭,不是做文章,不是绘画绣花,不能那样雅致,那样从容不迫,文质彬彬,那样温良恭俭让,盗墓是一门技术,一门进行破坏的技术。古代贵族们建造坟墓的时候,一定是想方设法的防止被盗,故此无所不用其极,在墓中设置种种机关暗器,消息埋伏,有巨石、流沙、毒箭、毒虫、陷坑等等数不胜数。到了明代,受到西洋奇技淫巧的影响,一些大墓甚至用到了西洋的八宝转心机关,尤其是清代的帝陵,堪称集数千年防盗技术于一体的杰作,大军阀孙殿英想挖开东陵用里面的财宝充当军饷,起动大批军队,连挖带炸用了五六天才得手,其坚固程度可想而知。盗墓贼的课题就是千方百计的破解这些机关,进入墓中探宝。不过在现代,比起如何挖开古墓更困难的是寻找古墓,地面上有封土堆和石碑之类明显建筑的大墓早就被人发掘得差不多了,如果要找那些年深日深藏于地下,又没有任何地上标记的古墓,那就需要一定的技术和特殊工具了,铁钎、洛阳铲、竹钉,钻地龙,探阴爪,黑折子等工具都应运而生,还有一些高手不依赖工具,有的通过寻找古代文献中的线索寻找古墓,还有极少数的一些人掌握秘术,可以通过解读山川河流的脉象,用看风水的本领找墓穴,我就是属于最后这一类的,在我的盗墓生涯中踏遍了各地,其间经历了很多诡异离奇的事迹,若是一件件的表白出来,足以让观者惊心,闻者乍舌,毕竟那些龙形虎藏、揭天拔地、倒海翻江的举动,都非比寻常。"
cleaned_data = ''.join(re.findall(r'[\u4e00-\u9fa5]', word))
print(cleaned_data)

输出结果如下图所示:

扫描二维码关注公众号,回复: 3866415 查看本文章

在只保留了中文的语料进行分词处理然后就可以封装成text对象:

wordlist = jieba.lcut(cleaned_data)
text = nltk.Text(wordlist)
print(text)

3.2 查看单词的上下文

在很多的nltk教程中将这个功能叫做搜索单词,但是他更直接的作用是查看上下文。为了查看效果我们将整个鬼吹灯小说作为语料,请参照如下代码:

f = open('gcd.txt','r')
word = f.read()
cleaned_data = ''.join(re.findall(r'[\u4e00-\u9fa5]', word))
wordlist = jieba.lcut(cleaned_data)
text = nltk.Text(wordlist)
text.concordance(word='僵尸',width=20,lines=10)

输出结果如下图所示:

搜索共同上下文:

text.common_contexts(['僵尸','鬼'])

3.2 统计词频

text.count(word='胖子')

3.3 绘制离散图

请查看如下代码:

words=['鬼','僵尸','胖子','老胡']
text.dispersion_plot(words)

输出结果如下图所示:

3.4 计算相似度

相似度的计算有两种方式,一种是通过上下文来计算相似度,比如,下面代码可以计算与一个词最相近的10个词:

text.similar(word='僵尸',num=10)

也可以使用ContextIndex对象来计算相似度:

from nltk.text import ContextIndex
contentindex = ContextIndex(wordlist)
similarity_scores = contentindex.word_similarity_dict(word='僵尸')
for key,value in similarity_scores.items():
    if value>0.02:
        print(key,value)

输出结果如下图所示:

猜你喜欢

转载自blog.csdn.net/amao1998/article/details/81562223
今日推荐