文本挖掘

25 篇文章 0 订阅
jieba是一个优秀的中文分词模块,使用python编写,并在Github上开源。 使用jieba分词可以将一整串的中文句式切分为独立的语言元素。

scikit-learn也是由python编写的机器学习算法库,其实现了许多有用的算法,对于文本分类来说,使用sklearn分类模型所需要的向量形式。使用sklearn 的 naive_bayes 算法库 可以快速构建一个朴素贝叶斯模型。对于文本分类这种动辄上万的维度的问题来说,朴素贝叶斯有以下特点:

模型简单
训练速度快
易于理解
结合以上两个工具的优秀特性,我们可以很轻松的构建一个文本分类器。使用jieba对文本进行分词,再使用sklearn的feature extraction模块对词袋进行Hashing Trick 得到向量形式,然后再训练bayes分类器,最后使用bayes分类器对未知的文本进行分类。

对于一个文本分类的问题来说,一共有以下几个阶段:

数据准备 : 要得到一个准确率高、效果好的模型,大量的数据是必须的。只有数据的量达到一定程度,模型的正确率才能达到一个可以接受的水平,数据的量与模型复杂度、置信率的关系,参见:VC维

数据清洗: 大量的数据中必然存在错误数据,我们要先尽可能的把不靠谱的数据剔除出去,不然就会出现”吃进去的是杂草,拉出来的是屎“ 这种情况。

特征提取: 对于文本分类问题来说,数据的特征可以是:词频特征、TF-IDF特征等. 由于词袋的规模非常的大,我们可以使用Hashing Trick 技巧来进行降维操作。当然,Hashing Trick的参数选择非常重要,太大了会导致运行缓慢甚至内存溢出,太低了会导致碰撞的几率加大,降低模型准确性。HashingTrick

训练模型:接下来就是将进行特征提取之后的特征向量喂给分类器。 通常,这类数据的数据结构是sklearn内建的spread矩阵或者是numpy的array. 关于sklearn的系数矩阵

交叉验证: 使用cross validate模块可以验证不同的模型对同一个问题的正确率差异。 便于我们选择更好的模型(其实这个我也没试过呢)

代码如下 :

import jieba
import csv
import sklearn.feature_extraction
import sklearn.naive_bayes as nb
import sklearn.externals.joblib as jl
import sys
def predict(txt):
    kv = [t for t in jieba.cut(txt)]
    mt = fh.transform([kv])
    num =  gnb.predict(mt)
    for (k,v) in catedict.viewitems():
        if(v==num):
            print(" do you mean...%s" % k )
def clipper(txt):
    return jieba.cut(txt)
if __name__=='__main__':
    # Load file.
    reader = csv.reader(open('catedict.csv'))
    catedict = {}
    catelist = []
    memolist = []
    #The target category. suck as 1 -> "晚餐"  , 2 -> "午餐"
    for i in reader :
        catelist +=[  [i[0],int(i[1]) ]  ] 
    catedict = dict(catelist)
    #init vars
    #the train data frame.
    reader = open('finished.csv','r')
    ctr = 0
    #that MODEL.
    gnb = nb.MultinomialNB(alpha = 0.01)
    #Hashing Trick, transfrom dict -> vector
    fh = sklearn.feature_extraction.FeatureHasher(n_features=15000,non_negative=True,input_type='string')
    kvlist = []
    targetlist = []
    # use partial fitting because of big data frame.
    for col in reader:
        line = col.split(',')
        if(len(line) == 2):
            line[1].replace('\n','')
            kvlist += [  [ i for i in clipper(line[0]) ] ]
            targetlist += [int(line[1])]
            ctr+=1
            sys.stdout.write('\r' + repr(ctr) + ' rows has been read   ')
            sys.stdout.flush()
        if(ctr%100000==0):

            print("\npartial fitting...")
            X = fh.fit_transform(kvlist)
            gnb.partial_fit(X,targetlist,classes = [i for i in catedict.viewvalues()])
            # clean context
            result = gnb.predict(X)
            rate = (result == targetlist).sum()*100.0 / len(result)*1.0
            print("rate %.2f %% " % rate)
            targetlist = []
            kvlist = []

    #finally , save the model
    jl.dumps(gnb,'final.pkl')
    #you can use the model and feature hasher another place to predict text category.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值