使用sklearn做文本特征提取

提取文本的特征,把文本用特征表示出来,是文本分类的前提,使用sklearn做文本的特征提取,需要导入TfidfVectorizer模块。

from sklearn.feature_extraction.text import TfidfVectorizer

一,使用sklearn做文本特征提取

sklearn提取文本特征时,最重要的两个步骤是:创建Tfidf向量生成器,把原始文档转换为词-文档矩阵。

使用TfidfVectorizer()函数创建向量生成器,最常用的参数是:stow_words="english",ngram_range,max_df,min_df ,其他参数请参考官方文档:

sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None, ngram_range=(1, 1), max_df=1.0, min_df=1, ...)

把原始文档转换为词-文档矩阵,返回的是一个稀疏矩阵:

fit_transform(raw_documents, y=None)

二,查看文档的特征

特征提取的简单步骤,corpus是语料,其结构是文档列表,每一个列表项都是一个文档(doc),语料共有5个文档:

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
    'Where can I find information about how to become a Surface or Surface Hub Microsoft Authorized Device Reseller (ADR)?'
    ,'If you are interested in becoming a Surface or Surface Hub Microsoft Authorized Device Reseller'
    ,'you should contact a Microsoft Surface Authorized Device Distributor and sign up to receive updates on the ADR program.'
    ,'Microsoft partner website: Contact a Microsoft Surface Authorized Device Distributor'
    ,'Sign up to receive updates on becoming a Microsoft Surface Hub ADR or installer'
]
vectorizer = TfidfVectorizer(stop_words ="english")
matrix= vectorizer.fit_transform(corpus)

1,查看文本特征

从原始文档列表(语料)中获取特征列表,相比原始文本的分词,特征显得更有意义,分析返回的特征,这5个文档放回18个特征:

>>> print(vectorizer.get_feature_names())
['adr', 'authorized', 'contact', 'device', 'distributor', 'hub', 'information', 'installer', 
'interested', 'microsoft', 'partner', 'program', 'receive', 'reseller', 'sign', 'surface', 'updates', 'website']

2,获取term和特征索引的映射

词和特征之间有映射关系,例如,词information对应的特征的索引是6,

>>> items=vectorizer.vocabulary_.items()
>>> print(items)
dict_items([('information', 6), ('surface', 15), ('hub', 5), ('microsoft', 9), ('authorized', 1), 
('device', 3), ('reseller', 13), ('adr', 0), ('interested', 8), ('contact', 2), ('distributor', 4),
('sign', 14), ('receive', 12), ('updates', 16), ('program', 11), ('partner', 10), ('website', 17), ('installer', 7)])

把dict_items结构转换为Python的字典结构:

>>> feature_dict = {v: k for k, v in vectorizer.vocabulary_.items()}
>>> feature_dict
{6: 'information', 15: 'surface', 5: 'hub', 9: 'microsoft', 1: 'authorized', 3: 'device', 
13: 'reseller', 0: 'adr', 8: 'interested', 2: 'contact', 4: 'distributor', 14: 'sign',
12: 'receive', 16: 'updates', 11: 'program', 10: 'partner', 17: 'website', 7: 'installer'}

3,查看词-文档矩阵

fit_transform()返回的是稀疏矩阵,属性shape表示矩阵的行-列数量,该共有5行18列,列代表的是特征,行代表的原始文档的数量,value代表该文档包含特征的TD-IDF值,范围从0-1。

>>> matrix.shape
(5, 18)
>>> print(matrix.todense())
[[0.32228866 0.27111938 0.         0.27111938 0.         0.32228866
  0.48123496 0.         0.         0.22931104 0.         0.
  0.         0.38825733 0.         0.45862207 0.         0.        ]
 [0.         0.28640134 0.         0.28640134 0.         0.34045484
  0.         0.         0.50836033 0.24223642 0.         0.
  0.         0.41014192 0.         0.48447285 0.         0.        ]
 [0.2782744  0.2340932  0.33523388 0.2340932  0.33523388 0.
  0.         0.         0.         0.19799453 0.         0.41551375
  0.33523388 0.         0.33523388 0.19799453 0.33523388 0.        ]
 [0.         0.25015965 0.35824188 0.25015965 0.35824188 0.
  0.         0.         0.         0.42316685 0.44403158 0.
  0.         0.         0.         0.21158343 0.         0.44403158]
 [0.32281764 0.         0.         0.         0.         0.32281764
  0.         0.48202482 0.         0.22968741 0.         0.
  0.38889459 0.         0.38889459 0.22968741 0.38889459 0.        ]]

三,特征提取的两个模型

特征提取的两种方法:词袋(Bag of Words)和TF-IDF

1,词袋模型

词袋模型(BoW)是从文本中提取特征的最简单方法。 BoW将文本转换为文档中单词出现的矩阵。 该模型关注文档中是否出现给定单词。

有三个文档(doc),每个文档是一行文本。

  • Doc 1: I love dogs.
  • Doc 2: I hate dogs and knitting.
  • Doc 3: Knitting is my hobby and passion.

根据这三个文档,创建文档和切词的矩阵,并计算单词出现在文档中的次数,这个矩阵叫做文档-词矩阵(DTM,Document-Term Matrix)。

这个矩阵使用的是单个词,也可以使用两个或多个词的组合,叫做bi-gram模型或tri-gram模型,统称n-gram模型。

from sklearn.feature_extraction.text import CountVectorizer
from nltk.tokenize import RegexpTokenizer
#tokenizer to remove unwanted elements from out data like symbols and numbers
token = RegexpTokenizer(r'[a-zA-Z0-9]+')
cv = CountVectorizer(lowercase=True,stop_words='english',ngram_range = (1,1),tokenizer = token.tokenize)
text_counts= cv.fit_transform(text_data)

2,TF-IDF模型

TF( 词频)是Term Frequency,计算每个单词在每个文档中的数量(频数),TF依赖于BOW模型的输出。

IDF(逆文档频率)是Inverse Document Frequency,反映关键词的普遍程度——当一个词越普遍(即有大量文档包含这个词)时,其IDF值越低;反之,则IDF值越高。IDF是包含该单词的文档数量和文档总数的对数缩放比例。

TF-IDF(术语频率 - 逆文档频率)模型是TF和IDF结合的产物,TF-IDF=TF*IDF。 在文档中具有高tf-idf的单词,大多数时间发生在给定文档中,并且在其他文档中不存在,所以这些词是该文档的特征词。

 

from sklearn.feature_extraction.text import TfidfVectorizer
tf=TfidfVectorizer()
text_tf= tf.fit_transform(doc_list)

 

 

参考文档:

文本中的特征提取与特征选择

sklearn.feature_extraction.text.TfidfVectorizer

python 文本特征提取 CountVectorizer, TfidfVectorizer

TF-IDF提取行业关键词

posted @ 2019-03-26 09:10 悦光阴 阅读(...) 评论(...) 编辑 收藏