目录
最小在学习nltk软件包,在此作简单梳理。
学习教程《用Python进行自然语言处理(中文)》,此教程用的nltk、python都为旧版本的,所以在实践过程还结合网上资料来解决一些问题。
一、软件安装
相关环境:win764系统,python3.3.2
首先,于官网下载nltk:https://pypi.python.org/pypi/nltk。win7下可直接下载编辑好的自动安装包nltk-3.2.1.win32.exe,双击可安装。其次,还要下载一些数据文件:
import nltk
nltk.download()
也可到http://nltk.org/nltk_data/手动下载,然后放到根目录下。(python安装根目录)
配合的还有很多小模块:matplotlib,numpy,six等。若不安装,在实践《用Python进行自然语言处理(中文)》教程时,会不出错提示信息。根据提示信息进行模块安装既可。
二、相关实践理解
《用Python进行自然语言处理(中文)》教程中,穿插着讲解自然语言处理、python语法、nltk功能,起初学习时,感觉乱乱的。在本文档梳理时:1,忽略python语法;2,根据对自然语言处理的基本流程的理解,对nltk的功能进行简单梳理。
2.1分词、词性标注
对一个字符串,nltk提供相关的分词、词性标注的功能。
>>>import nltk
>>>text=nltk.word_tokenize("And now for something completely different")
运行结果:['And','now', 'for', 'something', 'completely', '.']
>>>nltk.pos_tag(text)
:[('And','CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'),('.', '.')]
2.2句法、语义分析
nltk也提供相关句法分析相关的功能。但是没有详细去学习了解。包括上节的分词、词性标注,有专门针对中文的分析包,比如哈工大的LTP。
2.3加载语料库
针对一批语料,nltk提供了一些处理函数。对自己收集的文本文件, 并且想使用nltk提供的方法访问它们, 可以在NLTK中的PlaintextCorpusReader帮助下载入它们。
>>>rom nltk.corpus import PlaintextCorpusReader
>>>corpus_root = '/usr/share/dict'
>>>wordlists = PlaintextCorpusReader(corpus_root, '.*')
其中corpus_root是自己文本文件的目录。nltk的分词是针对英语的,可以自己处理好分词后,再将语料交给nltk来处理。
加载好了语料,究竟能作什么样的处理呢?nltk提供的基本语料库处理函数如下:
fileids() |
语料库中的文件 |
fileids([categories]) |
这些分类对应的语料库中的文件 |
categories() |
语料库中的分类 |
categories([fileids]) |
这些文件对应的语料库中的分类 |
raw() |
语料库的原始内容 |
raw(fileids=[f1,f2,f3]) |
指定文件的原始内容 |
raw(categories=[c1,c2]) |
指定分类的原始内容 |
words() |
整个语料库中的词汇 |
words(fileids=[f1,f2,f3]) |
指定文件中的词汇 |
words(categories=[c1,c2]) |
指定分类中的词汇 |
sents() |
指定分类中的句子 |
sents(fileids=[f1,f2,f3]) |
指定文件中的句子 |
sents(categories=[c1,c2]) |
指定分类中的句子 |
abspath(fileid) |
指定文件在磁盘上的位置 |
encoding(fileid) |
文件的编码(如果知道的话) |
open(fileid) |
打开指定语料库文件的文件流 |
root() |
到本地安装的语料库根目录的路径 |
这些是基本的函数,更多的功能还要结合其他模块使用。同时,nltk提供了很多的语料库:古腾堡语料库,网络和聊天文本,布朗语料库等。在教程中,利用这些语料库可以尝试nltk提供的其他功能。
2.4概率统计
nltk提供一些概率统计的类,结合上节边语料处理可以对语料进行深一步的分析。
2.4.1 FreqDist
初始化实例:fdist1=FreqDist(['abc','cd','cd']);
("FreqDist({'a': 5, ' ': 5, 'e': 5, 's': 3, 'n': 3, 'i': 2, 'p': 1, 'T': 1,'x': 1, 'c': 1, ...})")
fdist1=FreqDist('This is an example sentenceaaa')
("FreqDist({'cd':2, 'abc': 1})")
计算特定样本次数:fdist1['cd']
2
计算特定样本频率:fdist1.freq('cd')
0.6666666666666666
样本总数:fdist1.N()
3
fdist1.B()
2
遍历样本:for sample in fdist1:
print(sample)
abc
ab
数值最大的样本:fdist1.max()
'cd'
绘制频率分布表:fdist1.tabulate()
绘制频率分布图:fdist1.plot()
2.5聚类器
这块是主要是实践博文《Python自然语言处理(三) -- 利用NLTK进行聚类》。
import nltk
from numpy import array
#数据准备
datas=[array(v) for v in[(1,0),(0,1),(1,1),(5,5),(5,4),(4,5)]]
2.5.1Kmeans聚类
kmeans=nltk.cluster.kmeans.KMeansClusterer(num_means=2,distance=nltk.cluster.util.euclidean_distance)
kmeans.cluster(datas)
for data in datas:
print(str(data)+str(kmeans.classify(data)))
运行结果:
[1 0]0
[0 1]0
[1 1]0
[5 5]1
[5 4]1
[4 5]1
2.5.2gacc聚类
gaac=nltk.cluster.gaac.GAAClusterer(num_clusters=3,normalise=True)
gaac.cluster(vectors=datas)
gaac.dendrogram().show()
for data in datas:
print(str(data)+str(gaac.classify(data)))
运行结果:
2.5.3混合高斯聚类
emc=nltk.cluster.em.EMClusterer(initial_means=[[4,2],[4,2.01]])
emc.cluster(vectors=datas)
for data in datas:
print(str(data)+str(emc.classify(data)))
运行结果:
[1 0]0
[-2.64684557 -1.64676053] [[ 1.21320674-1.09210154]
[-1.09210154 1.21459578]]
[-2.68629598 -1.6863802 ] [[ 1.21627383-1.09378968]
[-1.09378968 1.21489809]]
[0 1]0
[-1.64684557 -1.64676053] [[ 1.21320674-1.09210154]
[-1.09210154 1.21459578]]
[-1.68629598 -1.6863802 ] [[ 1.21627383-1.09378968]
[-1.09378968 1.21489809]]
[1 1]0
[ 2.35315443 2.35323947] [[ 1.21320674 -1.09210154]
[-1.09210154 1.21459578]]
[ 2.31370402 2.3136198 ] [[ 1.21627383 -1.09378968]
[-1.09378968 1.21489809]]
[5 5]1
[ 2.35315443 1.35323947] [[ 1.21320674 -1.09210154]
[-1.09210154 1.21459578]]
[ 2.31370402 1.3136198 ] [[ 1.21627383 -1.09378968]
[-1.09378968 1.21489809]]
[5 4]1
[ 1.35315443 2.35323947] [[ 1.21320674 -1.09210154]
[-1.09210154 1.21459578]]
[ 1.31370402 2.3136198 ] [[ 1.21627383 -1.09378968]
[-1.09378968 1.21489809]]
[4 5]1
2.6分类器
在此只简单测试了朴素贝叶期、最大熵分类。
import nltk
from nltk.corpus import names
import random
########################################################官方例子,朴素贝叶期
#取得名字中的特征,以名字的最后一个字母作为特征
def gender_features(word):
return {'last_letter':word[-1]}
#构造数据集
namesljl=[(name,'male') for name innames.words('male.txt')]
namesljl=namesljl+[[name,'female'] for namein names.words('female.txt')]
random.shuffle(namesljl)
#构造特征函数
features=[(gender_features(n),g) for(n,g)in namesljl]
#构造训练集、特征集
train_set,test_set=features[500:],features[:500]
#构造分类器
classifier=nltk.NaiveBayesClassifier.train(train_set)
#classifier=nltk.MaxentClassifier.train(train_set)
#测试用例1
testone=classifier.classify(gender_features("Neo"))
print(testone)
#测试用例2
testone=classifier.classify(gender_features("Trinity"))
print(testone)
#测试用例3
print(nltk.classify.accuracy(classifier,test_set))
#可见数据集组织形式为:[('attr1':v1,'attr2',v2,...,'attrN',vN),(),()...]
三、结语
nltk还有很多强大的功能,还要后续在实践中学习。
参考学习资料:
《Python自然语言处理(三) -- 利用NLTK进行聚类》http://www.pythontip.com/blog/post/10044/