提取文本的特征,把文本用特征表示出来,是文本分类的前提,使用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)
参考文档: