文本特征提取和向量化
转自:https://fancoo.wordpress.com/2016/03/09/三-文本特征提取和向量化/
在(二)中,我已经能获取每个词条在百度搜索下的结果。我将所有的可疑词条的百度搜索结果保存为文件。每一行文本是一个词条的搜索结果。例如,我有728个可以词条,那么我将保存728行文本,现在我们要提取出每一行文本中的特征词。
接下来的操作依次是:
- 标记正负样本并下载它们的全部文本
- 对文本进行分词
- 通过Tf-Idf、词频、CHI、或是信息增益等方法取出特征词
- 将特征词向量化
获取正负样本
我使用手工的方法,在近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。
我的做法是:
- 先将正负样本词库整合,并计算每个词出现的次数t,假设出现次数最大的词出现次数为max,每个词的权重即为t/max,导师建议使用每个维度的最大次数而非全局,之后可以试试看。
- 构造正负样本矩阵并保存
- 构造测试样本的矩阵,矩阵的权重来源于训练样本。
代码如下:
合并词库:
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的格式):
文本特征提取和向量化相关推荐
- python文本特征提取实例_Python文本特征抽取与向量化算法学习
本文为大家分享了Python文本特征抽取与向量化的具体代码,供大家参考,具体内容如下 假设我们刚看完诺兰的大片<星际穿越>,设想如何让机器来自动分析各位观众对电影的评价到底是"赞 ...
- python 文本向量化_Python文本特征抽取与向量化算法学习
本文为大家共享了Python文本特征抽取与向量化的详细代码,供大家参考,详细内容如下 假设我们刚看完诺兰的大片<星际穿越>,设想怎么让机器来自动分析各位观众对电影的评价到底是"赞 ...
- Python文本特征提取 DictVectorizer CountVectorizer TfidfVectorizer 附代码详解
文章目录 DictVectorizer 对使用字典储存的数据进行特征提取与向量化 CountVectorizer / TfidfVectorizer 处理无特殊数据结构存储的数据 词袋模型(Bag o ...
- NLP基础--文本特征提取中文分词word2vec原理
文章目录 1. 文本特征提取 1.1 词集模型 1.2 BOW(Bag of Words)词袋模型 1.3 TF-IDF 2. 中文分词 2.1 基于词典匹配的分词方法 2.1.1 正向最大匹配(MM ...
- NLP中的语言模型及文本特征提取算法
本文以基本语言模型为逻辑主线,漫谈NLP中两个核心问题,即文本表示(Text Representation)与文本特征提取(Feature Engineering).通过本文你会发现,NLP的一部分经 ...
- 字典特征提取,文本特征提取。
文章目录 1 定义 2. 字典特征提取API 3. 字典特征提取案例: 1.实现效果: 2.实现代码 4. 文本特征提取 1. 方法 2. 英文案例 1. 实现效果 2.流程 3. 中文案例 使用到的 ...
- 机器学习 笔记05——特征工程之特征处理:字典特征提取、文本特征提取
目录 1.类别型特征的处理-特征编码 1.1 处理少量特征 1.2 处理大量的类别特征 1.3 字典特征提取(特征离散化) ⭐ 1.4 文本特征提取(英文+中文)⭐ 1.4.1 英文数据演示 1. ...
- 踩实底子|每日学习|02-特征工程和文本特征提取【下】
前文说到,特征工程是为了预测结果数据的处理步骤,也简单用了一两个实例说明了文本特征的提取,其中字典特征提取和文本特征主要是将特征数据化,也就是one-hot编码.为了不让一篇博文显得长篇大论,后面两个 ...
- Python 文本特征提取
文章目录 一.字典特征抽取 二.文本特征数值的统计 英文文本 中文文本 Tf-idf 一.字典特征抽取 使用到的API DictVectorizer(sparse=True) from sklearn ...
- 中文文本特征提取—流程
特征提取是机器学习的重要步骤,相对于英文文本来说,中文文本的特征提取就有些麻烦,因为英文是有空格隔开的,所以好处理.但是中文就不一样了,它是一句话,词与词之间没有分割符.所以必须先进行分割词. 中文文 ...
最新文章
- 提高工作效率-shell操作快捷键
- Yslow-23条规则
- webpack快速学习1
- Day7--误差反向传播
- expect脚本同步文件,expect脚本指定host和要同步的文件,构建文件分发系统,批量远程执行命令...
- Magento2创建自定义Widget 并通过添加图片选择器插入图片
- Python从零开始系列连载(32)——Python文件操作(下)
- configure: error: Please reinstall the libcurl distribution - easy.h should be ……
- rabbitmq4-工作队列及公平分发模式
- 基于python的火车票订票系统的设计与实现_火车票售票系统的设计与实现
- 构建多基因的系统发育树
- html+css制作小米商城官网初尝试
- 学习笔记 Tianmao 篇 recyclerView 的自定义使用
- 使用大神写的wz框架
- Linux at命令使用介绍
- 微信注册崩溃?appid签名无法注册or如何查看签名是否一致?如何注册appid?jks和keystore的区别?
- 使用C#进行串口通信开发上位机软件
- 云币网及KYC【区块链生存训练】
- html第一个子元素选择,css选中父元素下的第一个子元素(:first-child)
- 单元测试的必要性?一文聊聊单元测试