自然语言处理——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能够识别的编码。
打开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
来源:知乎