这段时间在研究自然语言处理的相关问题,主要是学习如划分数据,尝试过利用机器学习中的相关知识建立模型对数据进行评分后加以划分,但是由于语料库的不足导致训练出的模型对数据的区分度不够,另一方面也是因为部分数据比较‘刁钻’难以以正常方法区分。后来尝试过调用百度的词法分析,利用百度平台现成的技术对数据做初步处理,然后再进一步处理,这样会大大降低数据划分的难度。做到后面发现百度的词法分析存在太多不足,许多作品、名人以及地名都不能很好得到识别,基于百度词法分析得出数据划分结果正确率只能维持在85%上下,很难再得到提高。后面也试过利用boson平台的相关技术,和百度一样也存在很多不足。经过一番思考决定建立一套自己的数据划分流程,写下这篇博客用以记录。
这里我们把名人数据、非名人数据作为划分对象 名人数据:介绍某位名人的一段(一句)话,例如:Raj Babbar,演员,主要作品有《迷宫下的罪恶2》、《天命玩家》、《Bodyguard》等。 (下面统称为A数据) 非名人数据:不是介绍某位名人的一段(一句)话,例如:德国ABASAG一向致力於促进“企业资源规划系统”(ERP)在中国的发展。(下面统称为B数据)
数据划分流程主要分以下几个步骤:
数据分词,在整套流程中以结巴分词为标准,避免产生分词误差问题。以‘|’为分词的分隔符,在分词过后通过split()函数将词汇提取出来并存入词库。
text='|'.join(jieba.cut(text))
text_list = text.split('|')
很明显结巴分词完全可以达到我们想要的效果。
在经过第一步的分词后获取了大量词汇,第二步就是要把这些数据中具有代表性的高频词汇提取出来。按照每个词汇出现的频率进行统计,考虑到还存在是、的、这、而、与等等没有区分度的词汇,在提取高频词汇后我们还要将其中没有区分度的词汇删除防止其对我们后面的数据评分造成影响。(下面所说的高频词汇、特征词汇均不包括这些没有区分程度的词汇,就不多加赘述了)
特征词汇的评分规则如下
词汇频率 | 特征亲密度 | 评分 |
---|---|---|
前50 | 非常亲密 | 4分 |
50~100 | 亲密 | 3分 |
100~200 | 比较亲密 | 2分 |
还有一些明显的名人特征词汇,列举如下
数据类型 | 评分 |
---|---|
人名 | 4分 |
地名 | 3分 |
作品 | 4分 |
时间 | 4分 |
对于人名的识别,由于在英文取名这个小程序中我们存储了大量的名人,不需要花费太多精力可以直接进行判断。对于作品名,一般都是用书名号括起来的,这个也可以很好解决,对于地名这个就比较麻烦,我们现在没有现成的数据资源,还是需要借助百度的词法分析,条件允许的话最好还是自己收集地名数据,百度的词法分析有时候在地名的识别上还是不够准确的。
拿到每一条数据我们需要先进行分词,取得每条数据的词汇总数(n),每个词汇给予2分,那么该条数据的总分就是2n,下一步获取这条数据中特征词汇的得分(m),那么这条数据的合格率就是m/2n,评分就此完成。我们将所有数据的合格率进行统计并制成图。很明显A数据与B数据的分界线在0.35附近。
在这一步,我们就需要综合我们的评分规则以及我们在上一步得出来的数据合格率统计图,使AB之间分界线更加明确。不断细化特征数据的等级划分,提取前500个高频词汇分5个等级。对不同长度的数据AB分界线也是有所不同的,长数据包含有大量的解释性文字特征词汇占比相对较少,短数据言简意赅特征词汇占比多AB分界线自然随之右移。考虑到这一点我们就需要对不同长度的数据取不同的分界线,在优化时数据长度时细化它自然就需要考虑在内了。
随着优化的进行AB不断线性化,优化的难度越来越大效果也越来越小,AB分界线只能无限接近线性,如同一个反比例函数无限接近于坐标轴却永远不会相交于坐标轴。