文本特征提取的方法目前已经有很多种,传统的提取方法有平权统计、TF-IDF等,神经网络的方法有word2vec,接下来我会具体对这三种方法进行介绍,以及如何用代码实现。

本文全程干货 ,建议收藏。

One-Hot
One-Hot编码,又称独热编码,从提取方法来看也可以叫平权统计,非常容易理解,参见下述代码。

# 特征向量化——稀疏表示
from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()
corpus = ['This is the first document.','This is the second document.','And the third one','Is this the first document?']
"""
this is the first document second third and one
排序:and document first is one second the third this1    0      1      1    1  0    0     1    0     12    0      1      0    1  0    1     1    0     13    1      0      0    0  1    0     1    1     04    0      1      1    1  0    0     1    0     1
"""
X = vectorizer.fit_transform(corpus)
print(X)

上述代码中corpus这个list共有四句话,平权统计就是先统计好一共有哪些词(会统一小写化),像上文就一共有9个词,同时调用CountVectorizer时会对词库进行排序,如上所示。接着就是生成每一句的特征,这句话中出现了哪个词,就在对应的地方标1,其他地方就标0。

最终这个X就是我们提取到的文本特征啦。

另外,如果想要降低特征的稀疏性的话,可以使用CountVectorizer(min_df=2),这里min_df=2代表着只有频数(出现次数)超过2的词才会被记录。

注意,中文的话要事先分好词,即按空格分好。

TF-IDF

顾名思义,平权统计对于每一个词都一视同仁,但现实生活中我们都知道不同词语在句子中的重要性是不一样的,也就是说词与词之间的重要性不同。

TF-IDF(Term Frequency/Inverse Document Frequency)是信息检索领域非常重要的搜索词重要性度量;用以衡量一个关键词w对于查询(Query,可看作文档)所能提供的信息。

词频(Term Frequency, TF)表示关键词w在文档Di中出现的频率:

其中,count(w)为关键词w的出现次数,|Di|为文档Di中所有词的数量。

逆文档频率(Inverse Document Frequency, IDF)反映关键词的普遍程度——当一个词越普遍(即有大量文档包含这个词)时,其IDF值越低;反之,则IDF值越高。IDF定义如下:

其中,N为所有的文档总数,I(w,Di)表示文档Di是否包含关键词,若包含则为1,若不包含则为0。若词w在所有文档中均未出现,则IDF公式中的分母为0;因此需要对IDF做平滑(smooth):

最终关键词w在文档Di的TF-IDF值:

还是用上面那个例子:

from sklearn.feature_extraction.text import TfidfVectorizervectorizer = TfidfVectorizer()
corpus = ['This is the first document.','This is the second document.','And the third one','Is this the first document?']X = vectorizer.fit_transform(corpus)
print(X)

其中,X[0]即为第一句话的文本特征,X[1]即为第二句话的文本特征…

同样的,我们也可以用min_df这个参数来除去低频词。

word2vec

Word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。

通过Word2Vec算法得到每个词语的高维向量(词向量,Word Embedding)表示,词向量把相近意思的词语放在相近的位置。我们只需要有大量的某语言的语料,就可以用它来训练模型,获得词向量。(建议语料库的文本内容要和自己后面做的任务涉及的领域相同或相似,且语料库要足够大)

第一步:将one-hot形式的词向量输入到单层神经网络中,其中输入层的神经元结点个数应该和one-hot形式的词向量维数相对应。比如,输入词是“夏天”,它对应的one-hot词向量[0,0,1],那么,我们设置输入层的神经元个数就应该是3。
第二步:通过神经网络中的映射层中的激活函数,计算目标单词与其他词汇的关联概率,其中在计算时,使用了负采样(negative sampling)的方式来提高其训练速度和正确率。
第三步:通过使用随机梯度下降(SGD)的优化算法计算损失。
第四步:通过反向传播算法将神经元的各个权重和偏置进行更新。

那么怎么利用语料库来训练word2vec呢?

下面我们来实战演练一下。

假设我们现在已经有了一个语料库.txt,内容如下:

import jiebaimport multiprocessing
from gensim.models.word2vec import Word2Vecwith open('./语料库.txt', 'r', encoding='utf-8') as f:corpus = f.readlines()vocab = []
# 分词
for line in corpus:seg = jieba.lcut(line)vocab.append(seg)cpu_count = multiprocessing.cpu_count()
vocab_dim = 100 # 词向量对应的维度
n_iterations = 1
n_exposures = 10  # 所有频数超过10的词语
window_size = 7model = Word2Vec(size=vocab_dim,min_count=n_exposures,window=window_size,workers=cpu_count,iter=n_iterations)
model.build_vocab(vocab)  # input: list
model.train(vocab, total_examples=model.corpus_count, epochs=model.iter)
model.save('./w2v.pkl')
# print('加载word2vec模型')
# model = Word2Vec.load('./w2v.pkl')
print(model['舆情'])

如果是英文的话,除了前面的分词不一样,其余部分也是同样的步骤。

其中vocab_dim为词向量对应的维度,一般选100-200之间。

到现在呢,我们已经能够提取每个词的特征了,但是我们的任务是针对句子进行分类或者回归,对象是句子而非词语,所以我们需要进一步得到句子的特征。

我们用到的是求平均的方法,即通过将句子中出现的词的词向量的相加之后,再除以词的数量,得到句子的特征,这种方法简单,容易实现,但确实不可避免会忽视掉句子的语序信息。(但效果也不见得就比较差)

具体举例如下:

import numpy as np
import jieba# 直接词向量相加求平均
def fea_sentence(list_w):n0 = np.array([0. for i in range(vocab_dim)], dtype=np.float32)for i in list_w:n0 += ife = n0 / len(list_w)fe = fe.tolist()return fedef parse(data, word2vec):xVec = []for x in data:sentence = []for word in x:if word in word2vec:sentence.append(word2vec[word])else:  # 词不存在,则补零向量。sentence.append([0. for i in range(vocab_dim)])xVec.append(fea_sentence(sentence))xVec = np.array(xVec)return xVecif __name__ == '__main__':texts = ['如果是英文的话,除了前面的分词不一样,其余部分也是同样的步骤。','其中vocab_dim为词向量对应的维度,一般选100-200之间。','到现在呢,我们已经能够提取每个词的特征了,但是我们的任务是针对句子进行分类或者回归,对象是句子而非词语,所以我们需要进一步得到句子的特征。','我们用到的是求平均的方法,即通过将句子中出现的词的词向量的相加之后,再除以词的数量,得到句子的特征.']data = []for sentence in texts:seg = jieba.lcut(sentence)data.append(seg)print('加载word2vec模型')model = Word2Vec.load('./w2v.pkl')xVec = parse(data, model)

此时,xVec[0]即为第一句话的文本特征,xVec[1]即为第二句话的文本特征……

推荐关注的专栏

常见的文本特征(句向量)提取方法有哪些?什么是One-Hot、TF-IDF?word2vec如何训练?【Python】相关推荐

  1. NLP:自然语言处理领域常见的文本特征表示/文本特征抽取(本质都是“数字化”)的简介、四大类方法(基于规则/基于统计,离散式【one-hot、BOW、TF-IDF】/分布式)之详细攻略

    NLP:自然语言处理领域常见的文本特征表示/文本特征抽取(本质都是"数字化")的简介.四大类方法(基于规则/基于统计,离散式[one-hot.BOW.TF-IDF]/分布式[CO- ...

  2. AI基础:特征工程-文本特征处理

    0.导语 特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用. 在此之前,我已经写了以下几篇AI基础的快速入门,本篇文章讲解特征工程基础第三部 ...

  3. 2.文本预处理(分词,命名实体识别和词性标注,one-hot,word2vec,word embedding,文本数据分析,文本特征处理,文本数据增强)

    文章目录 1.1 认识文本预处理 文本预处理及其作用 文本预处理中包含的主要环节 文本处理的基本方法 文本张量表示方法 文本语料的数据分析 文本特征处理 数据增强方法 重要说明 1.2 文本处理的基本 ...

  4. 自然语言处理 文本预处理(下)(张量表示、文本数据分析、文本特征处理等)

    文章目录 一.文本张量表示方法 1. 什么是文本张量表示 2. 文本张量表示的作用: 3. 文本张量表示的方法: 4. one-hot词向量 4.1 什么是one-hot词向量表示 4.2 one-h ...

  5. NLP-文本处理:基本技术【命名实体识别、分词、拼写纠错、停用词、词性标注】、文本序列化、文本向量化、文本语料的数据分析、文本特征处理(Ngram特征添加、文本长度规范)、数据增强

    分词(tokenization):英文通过空格或者标点符号,就可以将词分开:而中文的分词会涉及很多问题(未登录词问题.分词歧义问题.分词不一致问题),所以会有各种不同分词的算法. 清洗:我们需要对文本 ...

  6. 文本特征处理(n-garm表示方法、长度规范)

    常见的文本特征处理方法: n-gram特征 文本长度规范 1. n-gram特征 句子可以用单个字,词来表示,但是有的时候,可以用2个.3个或者多个词来表示. N-gram是一组的词语,其中的N表示能 ...

  7. 【NLP】文本数据分析文本特征处理文本数据增强

    一.文本数据分析 文本数据分析的作用: 文本数据分析能够有效帮助我们理解数据语料, 快速检查出语料可能存在的问题, 并指导之后模型训练过程中一些超参数的选择. 常用的几种文本数据分析方法: 标签数量分 ...

  8. 句向量 Sentence Embedding

    句向量 Sentence Embedding 摘要 本文主要对句向量的发展和relate work介绍一下,可以看作一个简单的综述内容,句向量在NLP中有着很重要的作用,同时在许多NLP实际任务中会类 ...

  9. Pytorch 文本数据分析方法(标签数量分布、句子长度分布、词频统计、关键词词云)、文本特征处理(n-gram特征、文本长度规范)、文本数据增强(回译数据增强法)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 文本数据分析 学习目标: 了解文本数据分析的作用. 掌握常用的 ...

最新文章

  1. TabLayout的指示器长度 的问题
  2. 高速缓存的数据结构:拉链散列表
  3. 正则表达式的比较JDK1.4 vs jakarta
  4. 笑到打鸣~ | 今日趣图
  5. pcdmis怎么导出模型_从代数几何到导出代数几何:复形的几何
  6. 华为云ModelArts图深度学习,学习知识还能考取微认证
  7. yii2 asset.php,Yii2中使用asset压缩js,css文件的方法_php实例
  8. bios uefi legacy_安装win10用uefi还是legacy?win10 uefi引导修复教程
  9. SpringBoot配置参数绑定@ConfigurationProperties@Value
  10. Atitit 外观ui调整法 表单与表格列表
  11. MATLAB点与点之间连线
  12. 栅栏密码(Fence crypto)
  13. 0x00000004 因果推理 —— 入门学习笔记
  14. 【综述】(MIT博士)林达华老师-概率模型与计算机视觉”
  15. 计算机无法安装系统,电脑为什么重装不了系统?
  16. Python 爬虫——爬取文章自动发送QQ群
  17. 计算机丢失msvc80.dll,msvcr80.dll丢失如何解决-msvcr80.dll丢失的解决方法
  18. Numpy.array()详解 、np.array与np.asarray辨析、 np.array和np.ndarry的区别
  19. JMU软件计组期末复习总结
  20. 时序数据库-Timescale 在Windows上的安装

热门文章

  1. 基于串级PID的箱体自动恒温控制系统
  2. Python调用海康SDK进行车牌识别(动态链接库的方法—不通过swig)
  3. 【自动化测试】每天自动执行pytest自动化测试脚本,并生成allure报告
  4. mysql 进制转换函数_SQL Server 进制转换函数
  5. 智能工艺并不等同于计算机辅助工艺,关于人工智能技术在计算机辅助工艺设计中应用的探讨...
  6. 欧标语言等级划分 C1,德语欧标等级划分标准
  7. 最新正版防破解网络还原精灵免费推出
  8. 机器人是如何实现自主避障的?
  9. 38个常用的Python库
  10. DTCMS if判断语句标签