NLU Exams
NLU(Natural Language Understanding自然语言理解)是我大学时候学过的一门课程, 当时也就混混过了. 没想到出来工作之后还会遇到NLU的期末考试. 几乎是不懂的, 但还是试着做一下, 说不定什么时候有惊喜.
试题一: 1、统计布朗语料库里每种文体类型下的句子长度的条件频率分布
1、统计布朗语料库里每种文体类型下的句子长度(或者单词长度)的 条件频率分布(以文本类型作为条件,以句长(词长)作为事件),并在 python 编译器上绘制出频率分布曲线和频率分布表格。注:可以设置 plot 和 tabulate 里的参数来调整显示内容。如 tabulate(samples=range(10))。
##统计布朗语料库里每种文体类型下的句子长度(或者单词长度)的
##条件频率分布(以文本类型作为条件,以句长(词长)作为事件),并在
##python 编译器上绘制出频率分布曲线和频率分布表格。
import nltk
from nltk.corpus import brown
cfd = nltk.ConditionalFreqDist(
(genre, len(sent))
for genre in brown.categories()
for sent in brown.sents(categories=genre))
cfd.tabulate(samples=range(15)) ##绘制频率分布表,并限制其样本为15
cfd.plot(samples=range(15)) ##绘制频率分布图,并限制其样本为15
试题二:数据训练
2、○1以布朗语料库下的'humor'类('categories=’humor’)的 90%数据进行训练,10%的数据进行测试.按下列方式组合 trigram 标注器,bigram标注器,unigram 标注器和一个默认标注器.1.使用 trigram 标注器标注标志符,2.如果 trigram 标注器无法找到标记,尝试 bigram 标注器 3.如果 bigram 标注器无法找到标记则尝试使用 unigram 标注器 4.如果unigram 标注器也无法找到则使用默认标注器.○2 对前面设计好的标注器进行评估,然后对 text="""The double meaning in the anatomical made it a familiar vaudeville device , as in the gags of Weber and Fields ."""进行词性标记.
import nltk
from nltk.corpus import brown
brown_tagged_sents = brown.tagged_sents(categories='humor')
brown_sents = brown.sents(categories='humor')
size = int(len(brown_tagged_sents)*0.9) ##分离训练和测试数据,90%用于训练
train_sents = brown_tagged_sents[:size] ##90%用于训练
test_sents = brown_tagged_sents[size:] ##剩余10%用于测试
t0 = nltk.DefaultTagger('NN') ##组合标注器
t1 = nltk.UnigramTagger(train_sents,backoff=t0)
t2 = nltk.BigramTagger(train_sents,backoff=t1)
t3 = nltk.TrigramTagger(train_sents,backoff=t2)
print t3.evaluate(test_sents)
text = nltk.word_tokenize("The double meaning in the anatomical made it a familiar vaudeville device , as in the gags of Weber and Fields.")
print nltk.pos_tag(text)
试题三:分类器
3、设计一个分类器去分类 names 语料库的数据(分别包含 male 和 female 名字的文本库)。分类要求:需要设计自己的特征提取器,然后选择一种分类算法(决策树或朴素贝叶斯)训练分离后的训练数据,在对测试数据进行评估(评估的性能越高越好)。最后保存训练好的模型、加载此模型对任意的名字进行测试输出性别分类结果。
import nltk
from nltk.corpus import names
def get(name):
return classifier.classify(gender_features(name))
def gender_features(word):
return {'suffix1':word[-1:],'suffix2':word[-2:]}
names=([(name,'male') for name in names.words('male.txt')]+[(name,'female') for name in names.words('female.txt')])
featuresets = [(gender_features(n),g) for (n,g) in names]
train_set,test_set = featuresets[500:], featuresets[:500]
classifier = nltk.NaiveBayesClassifier.train(train_set)
print nltk.classify.accuracy(classifier,test_set)
试题四:冒泡排序
4、fruitPrices = {'apples':2.00, 'oranges': 1.50, 'pears': 1.75,'kiwis':1.00,'bananas': 1.50, 'peaches': 2.75} 定 义 一 个 冒 泡 排 序 函 数 ( 如maopao_dict(a))的形参是以一个字典(这里是 fruitPrices 的字典)作为输入,要求实现对字典值(水果的价格)排序好的链表。(输出结果应为[('kiwis', 1.0), ('bananas', 1.5), ('oranges', 1.5), ('pears', 1.75), ('apples',2.0), ('peaches', 2.75)])
fruitPrices = {'apples':2.00, 'oranges': 1.50, 'pears': 1.75,'kiwis':1.00, 'bananas': 1.50, 'peaches': 2.75} dict=sorted(fruitPrices.iteritems(),key=lambda d:d[1],reverse = False) print dict
or:
fruitPrices = {'apples':2.00, 'oranges': 1.50, 'pears': 1.75,'kiwis':1.00, 'bananas': 1.50, 'peaches': 2.75}
def maopao_dict(a):
return sorted(fruitPrices.iteritems(),key=lambda d:d[1],reverse = False)
print maopao_dict(fruitPrices)
or:
fruitPrices = {'apples':2.00, 'oranges': 1.50, 'pears': 1.75,'kiwis':1.00, 'bananas': 1.50, 'peaches': 2.75}
def maopao_dict(a):
keys=a.keys()
values=a.values()
length=len(values)-1
sorted=False
while not sorted:
sorted=True
for i in range(length):
if values[i]>values[i+1]:
sorted=False
values[i],values[i+1]=values[i+1],values[i]
keys[i],keys[i+1]=keys[i+1],keys[i]
return zip(keys,values)
print maopao_dict(fruitPrices)
试题五:类与对象
5、定义一个类对象(如 class read)在类对象中分别定义读取一个文本的函数、求文本的总单词个数的函数、求文本中总句子个数的函数、求文本中总字符长度的个数的函数。注:可以使用 open(‘1.txt’).read()去获取文本,nltk.word_tokenize 进行分词,nltk.sent_tokenize 进行分句。1.txt 这个文本是语料库任意文本或者可以直接使用课上文件夹(1)
内的文本。
import nltk.tokenize
class read:
text=""
def readText(self,file):
self.text=open(file).read()
def countWords(self):
tokens = nltk.word_tokenize(self.text)
return len(tokens)
def countSen(self):
tokens = nltk.sent_tokenize(self.text)
return len(tokens)
def countChar(self):
return len(self.text)
a=read()
a.readText("d:/1.txt")
print a.text
print "\n"
print "单词个数为"
print a.countWords()
print "句子个数为"
print a.countSen()
print "字符长度为"
print a.countChar()