常用工具包-nltk初步学习

时间:2021-08-09 06:10:42

         

目录

一、软件安装...1

二、相关实践理解...1

2.1分词、词性标注...2

2.2句法、语义分析...2

2.3加载语料库...2

2.4概率统计...3

2.4.1 FreqDist.3

2.5聚类器...4

2.5.1kmeans聚类...4

2.5.2gaac聚类...4

2.5.3混合高斯聚类...5

2.6分类器...6

三、结语...6

 

         最小在学习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()

常用工具包-nltk初步学习

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)))

运行结果:

  常用工具包-nltk初步学习

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/