转自:https://fancoo.wordpress.com/2016/03/09/三-文本特征提取和向量化/

在(二)中,我已经能获取每个词条在百度搜索下的结果。我将所有的可疑词条的百度搜索结果保存为文件。每一行文本是一个词条的搜索结果。例如,我有728个可以词条,那么我将保存728行文本,现在我们要提取出每一行文本中的特征词。

接下来的操作依次是:

  1. 标记正负样本并下载它们的全部文本
  2. 对文本进行分词
  3. 通过Tf-Idf、词频、CHI、或是信息增益等方法取出特征词
  4. 将特征词向量化

获取正负样本

我使用手工的方法,在近3000个样本分离出了150个负样本,也就是诸如’asdf’之类看上去很不正常的名称,正样本就选取带’有限公司’的公司名,并使用(二)中的方法,将正负样本的的网页搜索结果解析出来的 文本保存下来。

分词

中文分词我使用的是jieba,jieba有多种切词模式,还支持自定义停用词和idf词库,如果你使用的是jieba.analyse这个库,它支持tfidf和textRank两种特征,在我的使用过程中有一个很不爽的地方是,如果你仅仅使用jieba.cut,那么在原文本中包含的多种特殊符号将令人头疼(当然你也可以用正则消除掉),而一旦你使用jieba.analyse,你会发下它已经自动过滤了这些词,可是它已经使用了tf-idf或是textRank,一句话:如果你仅仅想用它来分词,提取特征的事情后续由自己来做,那么jieba.analyse会令人讨厌的先给你的词预筛选一遍。这里我topK设置为前10000个词,基本上不会筛掉词了。

分词代码段:

def extract_tag(text_file, tag_file):with open(text_file, 'r') as tf:for text in tf:utf8_text = text.decode('utf-8', 'ignore')#print utf8_textseg_list = jieba.cut(utf8_text, cut_all=True)clean_text = " ".join(seg_list)jieba.analyse.set_stop_words("extra/stop_words.dict")print '\n'tags = jieba.analyse.textrank(clean_text, topK=10000, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))print(" ".join(tags))mstr = " ".join(tags)mlist = mstr.split()mlist = list(set(mlist))with open(tag_file, 'a') as f:for item in mlist:utf8_item = item.encode('utf-8', 'ignore')f.write(utf8_item+'\t')f.write('\n')f.close()tf.close()

这里我得到一个tag_file,每一行有若干个词,代表这一个文本的特征集合,下面要做的事就是提取特征。

特征提取
我没有使用Tf-Idf,是因为它存在的一个严重缺陷是:假如一个词仅仅在某个类中出现过多次,那么其实该词是该类的一个非常好的特征,但根据Tf-Idf的机制,该词由于出现过太多次反而权重不高,在本次中,我目前使用的仅仅是词频,未来可能尝试其他方法。

向量化

所谓向量化,即对存在的词,每个词赋予其一个维度,然后对正负样本的每一行特征,按照其是否在特征向量中的某一维,决定该行特征是0还是非0。

我的做法是:

  1. 先将正负样本词库整合,并计算每个词出现的次数t,假设出现次数最大的词出现次数为max,每个词的权重即为t/max,导师建议使用每个维度的最大次数而非全局,之后可以试试看。
  2. 构造正负样本矩阵并保存
  3. 构造测试样本的矩阵,矩阵的权重来源于训练样本。

代码如下:

合并词库:

def merge_dict(pos_tag, neg_tag):"""Parameter-------pos_tag: file of pos tagneg_tag: file of neg tagsReturn-----mixed tags list"""words = []with open(pos_tag, 'r') as pt:for line in pt:word = line.split()for t in word:words.append(t)with open(neg_tag, 'r') as nt:for line in nt:word = line.split()for t in word:words.append(t)tag_list = list(set(words))print tag_listreturn tag_list

构造正负样本矩阵:

def get_libsvm_data(pos_tag, neg_tag, word_list, matrix_file):fmatrix = open(matrix_file, 'a+')with open(pos_tag, 'r') as pt:for line in pt:tag = []word_flag = []word = line.split()if len(word) == 0:continueword = list(set(word))tag.append('+1')for t in word:p = word_list.index(t)word_flag.append(p)word_flag.sort()for t in word_flag:tag.append(' '+str(t)+':'+'1')mstr = ''.join(tag)fmatrix.write(mstr)fmatrix.write('\n')with open(neg_tag, 'r') as nt:for line in nt:tag = []word_flag = []word = line.split()if len(word) == 0:continueword = list(set(word))tag.append('-1')for t in word:p = word_list.index(t)word_flag.append(p)word_flag.sort()for t in word_flag:tag.append(' '+str(t)+':'+'1')mstr = ''.join(tag)fmatrix.write(mstr)fmatrix.write('\n')

构造测试样本矩阵:

def shape_testdata(pos_test_tag, neg_test_tag, word_list, matrix_file):fmatrix = open(matrix_file, 'a+')with open(pos_test_tag, 'r') as pt:for line in pt:tag = []last_flag = 0  # if the last has valueword_flag = []word = line.split()if len(word) == 0:continueword = list(set(word))tag.append('+1')for t in word:if t in word_list:p = word_list.index(t)if p == len(word_list):last_flag = 1word_flag.append(p)word_flag.sort()if len(word_flag) != 0:for t in word_flag:tag.append(' '+str(t)+':'+'1')if last_flag == 0:tag.append(' '+str(len(word_list))+':'+'0')mstr = ''.join(tag)fmatrix.write(mstr)fmatrix.write('\n')with open(neg_test_tag, 'r') as nt:for line in nt:tag = []word_flag = []last_flag = 0word = line.split()if len(word) == 0:continueword = list(set(word))tag.append('-1')for t in word:if t in word_list:p = word_list.index(t)if p==len(word_list):last_flag = 1word_flag.append(p)word_flag.sort()if len(word_flag) != 0:for t in word_flag:tag.append(' '+str(t)+':'+'1')if last_flag == 0:tag.append(' '+str(len(word_list))+':'+'0')mstr = ''.join(tag)fmatrix.write(mstr)fmatrix.write('\n')

于是我们成功得到了训练样本和测试样本的矩阵,中间出现过一个bug是:训练样本和测试样本矩阵维度不同,这是由于记录时自动去除了值为0的维度,因此假如在测试样本中,未出现训练样本的末尾的维度,测试样本的维度将小于训练样本。改进是判断最后一维是否在测试样本中出现。未出现则注’0′

以下为矩阵格式(其实是libsvm的格式):

文本特征提取和向量化相关推荐

  1. python文本特征提取实例_Python文本特征抽取与向量化算法学习

    本文为大家分享了Python文本特征抽取与向量化的具体代码,供大家参考,具体内容如下 假设我们刚看完诺兰的大片<星际穿越>,设想如何让机器来自动分析各位观众对电影的评价到底是"赞 ...

  2. python 文本向量化_Python文本特征抽取与向量化算法学习

    本文为大家共享了Python文本特征抽取与向量化的详细代码,供大家参考,详细内容如下 假设我们刚看完诺兰的大片<星际穿越>,设想怎么让机器来自动分析各位观众对电影的评价到底是"赞 ...

  3. Python文本特征提取 DictVectorizer CountVectorizer TfidfVectorizer 附代码详解

    文章目录 DictVectorizer 对使用字典储存的数据进行特征提取与向量化 CountVectorizer / TfidfVectorizer 处理无特殊数据结构存储的数据 词袋模型(Bag o ...

  4. NLP基础--文本特征提取中文分词word2vec原理

    文章目录 1. 文本特征提取 1.1 词集模型 1.2 BOW(Bag of Words)词袋模型 1.3 TF-IDF 2. 中文分词 2.1 基于词典匹配的分词方法 2.1.1 正向最大匹配(MM ...

  5. NLP中的语言模型及文本特征提取算法

    本文以基本语言模型为逻辑主线,漫谈NLP中两个核心问题,即文本表示(Text Representation)与文本特征提取(Feature Engineering).通过本文你会发现,NLP的一部分经 ...

  6. 字典特征提取,文本特征提取。

    文章目录 1 定义 2. 字典特征提取API 3. 字典特征提取案例: 1.实现效果: 2.实现代码 4. 文本特征提取 1. 方法 2. 英文案例 1. 实现效果 2.流程 3. 中文案例 使用到的 ...

  7. 机器学习 笔记05——特征工程之特征处理:字典特征提取、文本特征提取

    目录 1.类别型特征的处理-特征编码 1.1 处理少量特征 1.2 处理大量的类别特征 1.3 字典特征提取(特征离散化) ⭐ 1.4   文本特征提取(英文+中文)⭐ 1.4.1 英文数据演示 1. ...

  8. 踩实底子|每日学习|02-特征工程和文本特征提取【下】

    前文说到,特征工程是为了预测结果数据的处理步骤,也简单用了一两个实例说明了文本特征的提取,其中字典特征提取和文本特征主要是将特征数据化,也就是one-hot编码.为了不让一篇博文显得长篇大论,后面两个 ...

  9. Python 文本特征提取

    文章目录 一.字典特征抽取 二.文本特征数值的统计 英文文本 中文文本 Tf-idf 一.字典特征抽取 使用到的API DictVectorizer(sparse=True) from sklearn ...

  10. 中文文本特征提取—流程

    特征提取是机器学习的重要步骤,相对于英文文本来说,中文文本的特征提取就有些麻烦,因为英文是有空格隔开的,所以好处理.但是中文就不一样了,它是一句话,词与词之间没有分割符.所以必须先进行分割词. 中文文 ...

最新文章

  1. 提高工作效率-shell操作快捷键
  2. Yslow-23条规则
  3. webpack快速学习1
  4. Day7--误差反向传播
  5. expect脚本同步文件,expect脚本指定host和要同步的文件,构建文件分发系统,批量远程执行命令...
  6. Magento2创建自定义Widget 并通过添加图片选择器插入图片
  7. Python从零开始系列连载(32)——Python文件操作(下)
  8. configure: error: Please reinstall the libcurl distribution - easy.h should be ……
  9. rabbitmq4-工作队列及公平分发模式
  10. 基于python的火车票订票系统的设计与实现_火车票售票系统的设计与实现
  11. 构建多基因的系统发育树
  12. html+css制作小米商城官网初尝试
  13. 学习笔记 Tianmao 篇 recyclerView 的自定义使用
  14. 使用大神写的wz框架
  15. Linux at命令使用介绍
  16. 微信注册崩溃?appid签名无法注册or如何查看签名是否一致?如何注册appid?jks和keystore的区别?
  17. 使用C#进行串口通信开发上位机软件
  18. 云币网及KYC【区块链生存训练】
  19. html第一个子元素选择,css选中父元素下的第一个子元素(:first-child)
  20. 单元测试的必要性?一文聊聊单元测试

热门文章

  1. 一文搞懂MEMS传感器产业链(最全解析!)
  2. 微信小程序之实现隔行变色表格
  3. 微信小程序倒计时组件
  4. LC串联和并联电路汇总
  5. Topaz Video Enhance Al视频无损放大软件常见问题指南
  6. opensips mysql_基于opensips mysql数据库用户管理
  7. Android中性能优化积累
  8. 树莓派容器中aplay没有声音的解决方案
  9. 文本编辑器-Sublime Text 安装汉化搭建C/C++环境教程
  10. 企业园区网IPv6地址规划方案与应用