(初学者)用python进行自然语言处理笔记二

语料库

本部分主要是接受nltk.corpus中的各种(主要的)语料库,以及一些统计信息。

# -*- encoding:utf-8 -*-


import nltk
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

'''
############################以下内容是有关古腾堡语料库的######################
#查看古腾堡中包含的电子书有哪些
print nltk.corpus.gutenberg.fileids()


#注意:为了避免每次都书写过长,可以如下形式导入

#引入古腾堡语料库
from nltk.corpus import gutenberg



#古腾堡中的'austen-emma.txt'所包含的词有哪些
emma=nltk.corpus.gutenberg.words('austen-emma.txt')
print emma
print len(emma)

emma=nltk.Text(nltk.corpus.gutenberg.words('austen-emma.txt'))
print emma
print emma.concordance('surprize')

for filed in gutenberg.fileids():
    num_chars=len(gutenberg.raw(filed))
    num_words=len(gutenberg.words(filed))
    num_sents=len(gutenberg.sents(filed))
    num_vocab=len(set([w.lower() for w in gutenberg.words(filed)]))
    #打印平均词长,平均句子长度,文本中内个词出现的平均次数
    print int(num_chars/num_words),int(num_words/num_sents),int(num_words/num_vocab),filed
'''


''''
########################以下内容是有关网络和聊天文本的################

#引入网络和聊天文本
from nltk.corpus import webtext


for fileid in webtext.fileids():
    print fileid+': '+webtext.raw(fileid)[:10]
#即时消息聊天会话语料库
from nltk.corpus import nps_chat
print nps_chat.fileids()
chatroom=nps_chat.posts('10-19-20s_706posts.xml')#表示2006年10月19日从20多岁聊天室收集的706个帖子。
print chatroom[1]
'''


'''
########################以下内容是有关布朗语料库################
from nltk.corpus import brown
print brown.categories()#打印文本类别
print brown.words(categories='news')#打印新闻类别的词汇
print brown.fileids(categories='news')#打印新闻列别的文档
print brown.words(fileids=['ca01'])#打印ca01的词汇
print brown.sents(categories=['news','editorial'])

#布朗语料库是一个研究文体之间的系统性差异(又叫文体学的语言研究)的资源。

#对特定文本进行计数
from nltk import FreqDist,ConditionalFreqDist
news_text=brown.words(categories='news')
fdist=FreqDist([w.lower() for w in news_text])
modals=['can','could','may','might','must','will']
for m in modals:
    print m+' : ',fdist[m]

#条件频率分布函数
cdf=ConditionalFreqDist((genre,word)
                        for genre in brown.categories()
                        for word in brown.words(categories=genre))
genres=['news','religion','hobbies','science_fiction']
modals=['can','could','may','might','must','will']
cdf.tabulate(conditions=genres,samples=modals)
'''

'''
########################以下内容是有关路透社语料库################
from nltk.corpus import reuters
#路透社语料库共包含10788个新闻文档,共计130万字,这些文档被分为90个主题,并未按照
#训练和测试分为两组。与布朗语料库不同的是,路透社语料库的类别是相互重叠的,因为新闻报道
# 往往涉及多的主题。

print reuters.fileids()[:10]
print reuters.categories()

#语料库方法即接受单个标示也接受标示列表作为参数
print reuters.categories('test/16581')
print reuters.categories(['test/16581','training/9992'])
print reuters.fileids('barley')
print reuters.fileids(['barley','corn'])
print reuters.words('training/9992')[:14]
print reuters.words(['test/16581','training/9992'])
print reuters.words(categories='barley')
print reuters.words(categories=['barley','corn'])
'''

'''
########################以下内容是有关就职演说语料库################
from nltk.corpus import inaugural
print inaugural.fileids()
cfd=nltk.ConditionalFreqDist((target,fileid[:4])
                             for fileid in inaugural.fileids()
                             for w in inaugural.words(fileid)
                             for target in ['america','citizen']
                             if w.lower().startswith(target))
for i in cfd.items()[:3]:
    print i

cfd.plot()
'''


#########################载入自己的语料库############################
from nltk.corpus import PlaintextCorpusReader

corpus_root=u'G:\\xunlian\\用python进行自然语言处理\\02'
wordlist=PlaintextCorpusReader(corpus_root,'a.txt')
print wordlist
print wordlist.fileids()
print wordlist.words('a.txt')
for w in wordlist.words('a.txt'):
    print w

NLTK中定义的基本语料库函数如下所示,你也可以使用help(nltk.corpus.reader)来查找更多的说明文档。

这里写图片描述

到目前为止,我们已经看到了大量的语料库结构,在此我们总结一下:

最简单的一种就是没有任何结构,仅仅是一个文本集合。
有的文本会按照其对应的文体、来源等分类。
有的文档的类别会重叠,尤其是按照主题进行分类的情况下,因为一个文本可能与多个主题相关。
有的文本集是有一个时间结构的,新闻集合时最常见的例子。

如下图所示:

这里写图片描述

条件概率分布

本部分主要介绍nltk中的FreqDistConditionalFreqDist,相关用法如下所示:

# -*- encoding:utf-8 -*-


import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from nltk import FreqDist
import nltk
'''
####################基本认识######################
a=['a','b','c','a','d','c']
fdist=FreqDist(a)
print fdist
for item in fdist.items():
    print item

a=[('a','b','c'),('a','d','c')]
fdist=FreqDist(a)
print fdist
for item in fdist.items():
    print item

'''

##############################FreqDist################################
# 导入 gutenberg 集
>>> from nltk.corpus import gutenberg
# 都有些什么语料在这个集合里?
>>> print gutenberg.fileids()
['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt', 'blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt', 'carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt', 'chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt', 'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt', 'shakespeare-macbeth.txt', 'whitman-leaves.txt']

# 导入 FreqDist 类
>>> from nltk import FreqDist
# 频率分布实例化
>>> fd = FreqDist()
# 统计文本中的词例
>>> for word in gutenberg.words('austen-persuasion.txt'):
... fd.inc(word)
...
>>> print fd.N() # total number of samples
98171
>>> print fd.B() # number of bins or unique samples
6132
# 得到前 10 个按频率排序后的词
>>> for word in fd.keys()[:10]:
... print word, fd[word]
, 6750
the 3120
to 2775
. 2741
and 2739
of 2564
a 1529
in 1346
was 1330
; 1290

#########################ConditionalFreqDist##############################
from nltk.corpus import inaugural
cfd=nltk.ConditionalFreqDist((target,fileid[:4])
                             for fileid in inaugural.fileids()
                             for w in inaugural.words(fileid)
                             for target in ['america','citizen']
                             if w.lower().startswith(target))
for i in cfd.items()[:3]:
    print i

cfd.plot()




###############产生随机文本######################

def generate_model(cfdist,word,num=15):
    for i in range(num):
        print word,
        word=cfdist[word].max()
text=nltk.corpus.genesis.words('english-kjv.txt')
bigrams=nltk.bigrams(text)
cfd=nltk.ConditionalFreqDist(bigrams)
print cfd['living']
for item in cfd['living'].items():
    print item
print cfd['living'].max()

#以living为开头,产生包含20个词的文本
generate_model(cfd,'living',num=20)

图像结果如下所示:

这里写图片描述

WordNet

本部分主要接受nltk中的wordnet,相关用法如下所示:

# -*- encoding:utf-8 -*-

import nltk
from nltk.corpus import wordnet as wn

#同义词集
print wn.synsets('motorcar')#查看motorcar的同意词集

#'car.n.01':表示car 的第一个名词意思

print wn.synset('car.n.01').definition()#指出同义词集的定义
print wn.synset('car.n.01').examples()#举一个同义词集的一个例子

Lemmas=wn.synset('car.n.01').lemmas()#词条集,列出一个同义词集中的所有词条
print Lemmas

Lemma_names= wn.synset('car.n.01').lemma_names()#列出一个同义词集的所有词条的名字
print Lemma_names

#词条
print wn.lemma('car.n.01.automobile').synset()#列出该词条所属的同义词集
print wn.lemma('car.n.01.automobile').name()#列出该词条的名字

##综合
for lemma in wn.synset('car.n.01').lemmas():
    print lemma.name

'''
#对于car来说,含有多种含义,例如火车车厢、货车或者电梯厢等,共有5中同义词集
print wn.synsets('car')
for synset in wn.synsets('car'):
    print synset.lemma_names()
'''

##########################################################################################
dog=wn.synset('dog.n.01')
print dog.hypernyms()#上位词集合
print dog.root_hypernyms()#得到一个最一般的上位(或根上位)同义词集合
print dog.hyponyms()#下位词集合
#从物品到他们的部件(部分)或者到它们被包含其中的东西(整体)。例如,一棵树的部分是它的树干等


#反义词
good=wn.synset('good.a.01')
print good.lemmas[0].antonyms()


#Similarity
dog=wn.synset('dog.n.01')
cat=wn.synset('cat.n.01')

#synset1.path_similarity(synset2): 是基于上位词层次结构中相互连接的概念之间的最短路径
# 在0-1范围的打分
# (两者之间没有路径就返回-1)。同义词集与自身比较将返回1

print dog.path_similarity(cat)
print cat.path_similarity(cat)

《本节完》

                        所谓的不平凡就是平凡的N次幂。
                                                    ----By Ada
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱科研的徐博士

请各位看官赏赐,小仙女笔芯笔芯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值