NLP之文本特征提取详解

NLP之文本特征提取详解

深度学习入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。

✨NLP系列✨

NLP之文本预处理详解_tt丫的博客-CSDN博客_nlp文本预处理

NLP之文本特征提取详解_tt丫的博客-CSDN博客

目录

一、词袋模型(Bag of Words, BoW)

1、目的

2、主要思想

3、具体算法步骤

4、缺点

5、词袋管理

6、代码实现

二、TF-IDF文本特征提取

1、定义与用途

2、缺点

3、代码实现

三、基于词向量的特征提取模型 —— word2vector

1、word2vector定义介绍

2、基于神经网络语言模型的词向量生成(NNLM)

3、CBoW模型

4、Skip-gram模型

5、两种优化的方法

一、词袋模型(Bag of Words, BoW)

1、目的

将不定长的文本型数据转化为定长的数值型数据,方便用作机器学习模型的输入

2、主要思想

建立一个词典库,其中包含训练语料库的所有词语,每个词语都对应一个唯一识别的编号,利用one-hot文本(即存在的词语用1表示,不存在的用0来表示)来表示;文档的词向量维度与单词向量的维度相同,每个位置的值是对应位置词语在文档中出现的次数。

他是N-gram模型的特例1元模型

3、具体算法步骤

(1)对所有文本进行单词提取,生成词袋

eg:She is a good girl.He is a good boy. It is a pig.

生成的词袋有:she;is;a;good;girl;he;boy;it;pig

(2)将词袋中的单词与词向量中的值一一对应

对应法则:该单词在当前文本中总共出现的次数

即:(所谓的one - hot 编码)

"She is a good girl" = [1,1,1,1,1,0,0,0,0]

"He is a good boy" = [0,1,1,1,1,1,0,0,0]

"It is a pig" = [0,1,1,0,0,0,0,1,1]

4、缺点

(1)仅考虑词语出现的次数,没有考虑句子词语之间的顺序信息,即语义信息未考虑

(2)词袋太大,占用过多

(3)文档(词向量)稀疏(即0值特别多)

5、词袋管理

基于上面所阐述的缺点,我们需要使用合理的方法来压缩词袋的大小

压缩方法有:

(1)忽略人名、地名等对象的名字

(2)忽略高频且无意义的词,如:a,the,的,了(去除停用词)

(3)将单词的变形(如过去式、过去分词)统一转化为词干

(4)用词组来组成词袋,这样不仅减少了词袋的大小,而且会更有意义(N-gram模型)

有关去除停用词和N-gram的介绍可以看博主往期文章NLP之文本预处理详解_tt丫的博客-CSDN博客

6、代码实现

主要通过sklearn.feature_extraction.text中的CountVectorizer类来实现

CountVectorizer是特征数值计算类,对于每个文本通过fit_transform方法来计算每个单词在该文本中出现的频率,形成词频矩阵。 通过get_feature_names可查看所有文本关键字,通过toarray可查看到文本的词袋模型结果

🌳首先导入所需的库

from sklearn.feature_extraction.text import CountVectorizer

🌳提取文本文件中的语料,分句

path = "1.txt"

f = open(path, 'r', encoding= 'utf-8', errors= 'ignore')

text = []

piece = ''

for line in f:

for uchar in line:

if uchar == '\n':

continue

if uchar == '.' or uchar == '?' or uchar == '!':

text.append(piece)

piece = ''

else:

piece = piece + uchar

其中1.txt文件是待处理的文本

I have a pen.I love this pen.I have an apple.I love to eat apples. You have a book.

处理后

['I have a pen', 'I love this pen', 'I have an apple', 'I love to eat apples', 'You have a book']

🌳定义提取特征对象

v = CountVectorizer()

🌳对文本提特征,转为词袋模型

dtext = v.fit_transform(text)

dtext = dtext.toarray()

print(dtext)

feature = v.get_feature_names()

print(feature)

输出

[[0 0 0 0 0 1 0 1 0 0 0] [0 0 0 0 0 0 1 1 1 0 0] [1 1 0 0 0 1 0 0 0 0 0] [0 0 1 0 1 0 1 0 0 1 0] [0 0 0 1 0 1 0 0 0 0 1]] ['an', 'apple', 'apples', 'book', 'eat', 'have', 'love', 'pen', 'this', 'to'

相关推荐