提取文本的特征, 把文本用特征表示出来, 是文本分类的前提, 使用 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(data['Phrase'])
2,TF-IDF 模型
TF( 词频)是 Term Frequency, 计算每个单词在每个文档中的数量(频数),TF 依赖于 Bow 模型的输出.
IDF(反向文档频率)是 Inverse Document Frequency, 测量给定单词在文档中提供的信息量, IDF 是包含该单词的文档数量和文档总数的对数缩放比例.
TF-IDF(术语频率 - 逆文档频率)规范化文档术语矩阵, 它是 TF 和 IDF 的产物. 在文档中具有高 tf-idf 的单词, 大多数时间发生在给定文档中, 并且必须在其他文档中不存在, 所以这些词必须是一个特征词.
- from sklearn.feature_extraction.text import TfidfVectorizer
- tf=TfidfVectorizer()
- text_tf= tf.fit_transform(doc_list)
参考文档:
文本中的特征提取与特征选择
来源: https://www.cnblogs.com/ljhdo/p/10578047.html