从今天开始进入半自动标注实践部分。为了防止到最后没有人工标注,所以考虑做两手准备,第一手根据NB输出的各类目概率通过最大概率比率法得到候选类目,根据候选类目数占总类目数比率决定是否交由人工标注。第二手随着EM-NB的实验,逐渐丰富标注语料,构建仅可能泛化的模型,这期间肯定需要找各种标注语料,同时总结类关联词规则。
进入今天的主题。今天我们对tt2a语料进行整理。
1. tt2a语料各类目下文本数量
![e2e4b020d67ac35477b814bed2ecf075.png](https://i-blog.csdnimg.cn/blog_migrate/e9a891beff260859f3f9bef4db15e16e.jpeg)
![20732f836e2848b8de70d4f000621b31.png](https://i-blog.csdnimg.cn/blog_migrate/ec4cb5ff24079d9600e8082be0e5a780.jpeg)
2. tt2a语料类目名称与系统类目名称映射关系表
该表通过人工查阅语料后手工整理。只对与系统类目名称有关联的类目进行映射,其他类目则不进行处理(即滤掉没有映射关系的类目下数据)。
3. tt2a训练语料生成
新增代码,将tt2a语料按照上表中映射关系转成具有本系统类目名称的语料。代码如下
#coding:utf-8
"""
"""
import codecs
category_map_dict = dict()
with codecs.open('category_map.txt', 'rb', 'utf-8', 'ignore') as infile:
for line in infile:
line = line.strip()
if line:
old_category_name, new_category_name = line.split(u't')
category_map_dict[old_category_name] = new_category_name
# 输出文件名需要根据实际文教修改
outfile = open('train_data.txt', 'wb')
# 输入文件名需要根据实际文件修改
with codecs.open('../data/tt_2a.txt', 'rb', 'utf-8', 'ignore') as infile:
for line in infile:
line = line.strip()
if line:
try:
category_name, text = line.split(u't')
except ValueError:
print("ValueError: not enough values to unpack (expected 2, got 1)", line)
continue
# 类目名称中不可以含有/
if category_name.find(u"/") != -1:
print("error: category_name illeagal ", line)
continue
# 类目名称中不可以含有
if category_name.find(u'') != -1:
print("error: category_name illeagal ", line)
continue
if category_name in category_map_dict:
out_str = u'%st%sn' % (category_map_dict[category_name], text)
outfile.write(out_str.encode('utf-8', 'ignore'))
outfile.close()
以上为今天所处理的内容,本想着能用前边写的特征选择方法来看看tt2a语料中各类目的top10关键词,根据关键词来确定哪些类目需要映射。但是,之前在专栏中所写的特征选择方法运行了3个小时没有结果,说明代码的时间复杂度太大了,毕竟每个类目中每个词项都要遍历一整遍语料,整个语料44万条标题。当然,可以采用扫一遍语料的方法来计算出每个词项的的N00,N01,N10,N11,不过这个过程懒得自己写代码了,今天看sklearn中应该是特征选择的类,后续会尝试用一下,这样的话,之前的特征选择示例代码也就不要改动了,就把那些代码作为一种演示好了。
最近各语言大学都开始搞起人工智能了,乘风破浪吧,前几年的SVM以及那几个序列模型已经把语言学的人挤得没啥话语权了,到了16年深度学习出来以后彻底没话了。只要一回归语言学,估计就避免不了要用规则。让他们掐吧,要是真把效果提升到100%了,那我们这些所谓的“算法”工程师也就离回家不远了,不过大家应该不用太担心,因为基本上10年内不太可能。