加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

基于sklearn的文本特征提取与分类

发布时间:2020-12-14 03:24:42 所属栏目:大数据 来源:网络整理
导读:原文地址http://blog.csdn.net/u010297828/article/details/50465263 本文呢是根据自己参加中移动 垃圾短信基于文本内容识别 竞赛而写的大数据与智能计算主页,竞赛描述网址:http://www.wid.org.cn/data/science/player/competition/detail/description/227

本文呢是根据自己参加中移动垃圾短信基于文本内容识别竞赛而写的大数据与智能计算主页,竞赛描述网址:http://www.wid.org.cn/data/science/player/competition/detail/description/227由于比赛结果不太好,就记录一下用sklearn做文本特征提取这一块吧,当时也参考许多的博文,如Feature extraction - sklearn文本特征提取?和应用scikit-learn做文本分类?以及文本挖掘之特征选择(python 实现)? 等文章。

题目是80万条短信作为训练数据,10%的垃圾短信(label = 1),90%正常短信(label = 0),然后在20万条数据作为测试对象,找出垃圾短信与正常短信。我最终的评分是0.985,相对于第一0.997还是有很大差距,排名59/339。具体竞赛内容可以参考中国好创意比赛官网。

文本分类大致可以分为:出本处理,特征提取,特征选择,分类,预测几个步骤,其中前三步占用80%的工作量。

1.文本处理

分词,去除停用词等。文本处理要做的内容很多,如果需要请参考其他文献。

分词我采用结巴分词,有比较好用的Python包,Python中文分词组件 以供参考

去除停用词需要根据实际情况作考虑,一般情况是需要的。

文本处理后,得到的应该是每条短信对应的分词表,如:原”商业秘密的秘密性那是维系其商业价值和垄断地位的前提条件之一“经过处理后为”商业秘密 秘密性 维系 商业价值 垄断 地位 前提条件 之一 “

核心代码:

[python]? view plain ?copy
  1. #???(i?not?in?stopWords)?and??????
  2. def?cutWords(msg,stopWords):??
  3. ????seg_list?=?jieba.cut(msg,cut_all=False)??
  4. ????#key_list?=?jieba.analyse.extract_tags(msg,20)?#get?keywords???
  5. ????leftWords?=?[]???
  6. ????for?i?in?seg_list:??
  7. ????????if?(i?not?in?stopWords):??
  8. ????????????leftWords.append(i)??????????
  9. ????return?leftWords??
  10. ??
  11. #获取停用词表??
  12. def?loadStopWords():???
  13. ????stop?=?[line.strip().decode('utf-8')??for?line?in?open('../data/stopWord.txt').readlines()?]???
  14. return?stop??
2.特征提取,特征选择

这里呢就需要参考上面的提到的两个参考博文了,具体API的用法可以参考sklearn官网? 这里使用的是tfidf特征

核心代码举例,具体参考附录的完整工程:

#navie?bayes?classifier??
  • def?nbClassifier(trainData,testData,trainLabel,testLabel):??
  • ????vectorizer?=?CountVectorizer(binary=True)??
  • ????fea_train?=?vectorizer.fit_transform(trainData)??
  • ????fea_test?=?vectorizer.transform(testData);????
  • #?????tv=TfidfVectorizer()#该类会统计每个词语的tf-idf权值??????
  • #?????fea_train?=?tv.fit_transform(trainData)????#return?feature?vector?'fea_train'?[n_samples,n_features]????
  • #?????fea_test?=?tv.transform(testData);????
  • print?'Size?of?fea_train:'?+?repr(fea_train.shape)???
  • print?'Size?of?fea_test:'?+?repr(fea_test.shape)???
  • print?fea_train.nnz??
  • print?fea_test.nnz??
  • ??
  • ????clf?=?MultinomialNB(alpha?=?0.01)?????
  • ????clf.fit(fea_train,np.array(trainLabel))??
  • ????pred?=?clf.predict(fea_test)??
  • ????totalScore(pred,testLabel)??

  • 3.分类,预测

    这个不多说,常见的方法就那么几种,相差不会很大。如果需要达到很高的分数还需要算法上的修改优化。

    4.改进

    由于垃圾短信中存在特殊字符,比如,三角/方框/繁体字等,在预处理时可以建立所有文档的异常符号词库,作为字典,对结果肯定有提升.

    参考比赛第一名的ppt,对我来说参考意义也蛮大,需要的可以在我的资源点击打开链接查看.

    本人的工程代码以及数据请到我的github主页下载点击打开链接

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读