使用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)。

使用sklearn做文本特征提取

这个矩阵使用的是单个词,也可以使用两个或多个词的组合,叫做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(data[\'Phrase\'])

2,TF-IDF模型

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

IDF(反向文档频率)是Inverse Document Frequency,测量给定单词在文档中提供的信息量,IDF是包含该单词的文档数量和文档总数的对数缩放比例。

使用sklearn做文本特征提取

TF-IDF(术语频率 - 逆文档频率)规范化文档术语矩阵,它是TF和IDF的产物。 在文档中具有高tf-idf的单词,大多数时间发生在给定文档中,并且必须在其他文档中不存在,所以这些词必须是一个特征词。

 使用sklearn做文本特征提取

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

 

 

参考文档:

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

sklearn.feature_extraction.text.TfidfVectorizer

给TA打赏
共{{data.count}}人
人已打赏
随笔日记

卷积神经网络帮你搞定图像识别【图像识别】

2020-11-9 4:00:21

随笔日记

从统计局采集最新的省市区镇数据,用js在浏览器中运行 V2

2020-11-9 4:00:23

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索