自然语言处理——3.28课后作业

问题:设计汉语的组合标注器,训练和测试语料使用thulac标注过的汉语文本。

1.导入thulac模块,对文件Leipzig10ksents.txt进行分词并标注。

import thulac
thu = thulac.thulac()
thu.cut_f('/Users/chenqiutong/U盘备份/Qamra--NLP/lesson_4/Leipzig10ksents3.txt','/Users/chenqiutong/U盘备份/Qamra--NLP/lesson_4/Leipzig10ksents4.txt')

标注后的语料如下:

 

 

2.逐行读取文件后,将每行分割;因为thulac标注的文本输出与nltk标注器要求输入的格式不合,需要将thulac标注的文本格式进行转换成(word,word_tag),使用nltk的str2tuple()函数完成。

f = open(r'/Users/chenqiutong/U盘备份/Qamra--NLP/lesson_4/Leipzig10ksents4.txt','r')
raw = f.readlines()
sent = []
for line in raw:
    s = []
    s.append([nltk.tag.str2tuple(s.replace('_','/')) for s in line.split()]) #对每行分割,进行符号的替换,并且将其转换成元组形式
    sent += s

 

3.语料库需要分为训练集和测试集,一般还有验证集,按照8:1:1的比例设置,在这里没有验证集,所以我们按照8:2或者9:1的比例进行。图下为9:1的比例:

size = int(len(sent) * 0.9)
train_sent = sent[:size] #训练集
test_sent = sent[size:]  #测试集

 

4.为了达到较好的标注效果,我们通常使用组合标注器。

t0为默认标注器,t1为一元标注器,t2为二元标注器,t3为正则表达式标注器。

 

import nltk
patterns = [(r'[0-9]+', 'M'),(r',|。|?|!|:|“|”|~|...','W')]

t0 = nltk.DefaultTagger('N')  #默认标注为“N”
t1 = nltk.UnigramTagger(train_sent, backoff=t0)  #一元标注
t2 = nltk.BigramTagger(train_sent, backoff=t1)   #二元标注
t3 = nltk.RegexpTagger(patterns,backoff=t2)  #正则标注
#t3.tag(test_sents)

t3.evaluate(test_sent) #准确率评估
0.8170434782608695 #评估结果

 

番外:由于系统编码的问题,txt文件需要在终端进行转码

Linux和Mac OS 为我们提供了强大的命令行,所以我们可以使用iconv 对txt文件进行转码,

操作如下:
打开terminal,在其中输入:
cd [文件所在目录]
按回车,再输入:
iconv -c -f GB2312 -t UTF-8 [你要看的文件] >> [新文件的名称]
然后按下回车,就可以了。
例如我下载了电子书 凡人修仙转.txt 那么我就可以用下面的命令:
cd ~/Downloads/ibook/
iconv -c -f GB2312 -t UTF-8 凡人修仙转.txt >> 凡人修仙转2.txt
这样,凡人修仙传2.txt 这个文件就可以在Mac中打开了。
需要注意的是,在上述命令中,GB2312指的是原文件的编码,UTF-8是要转换的目的文件的编码。GB2312这个是常用的中文编码,其他还有gbk等等编码,如果这个命令不行可以试试其他编码。UTF-8是mac能够识别的编码。

参考:   作者:赵志刚
    链接:https://www.zhihu.com/question/20353626/answer/68746981
    来源:知乎


posted @ 2018-04-03 17:25  Qamra  阅读(455)  评论(0编辑  收藏  举报