赞
踩
两者区别在于词袋模型增加了对具体单词(特征)频率的维度。
1.1导包
from sklearn.feature_extraction.text import CountVectorizer
1.2函数介绍
CountVectorizer:收集的文本文档转换为矩阵的令牌数量
class sklearn.feature_extraction.text.CountVectorizer(*, input='content', encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern='(?u)\b\w\w+\b', ngram_range=(1, 1), analyzer='word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class 'numpy.int64'>)
常用参数介绍:
1.3 代码示例
corpus = [
'This is the first document.',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?',
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
# 获取词袋化特征向量
print(X.toarray())
# 获取对应的字节名称
print(vectorizer.get_feature_names())
输出:
[[0 1 1 1 0 0 1 0 1]
[0 2 0 1 0 1 1 0 1]
[1 0 0 1 1 0 1 1 1]
[0 1 1 1 0 0 1 0 1]]
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
使用现有的词袋的词汇表,对其他文本进行特征提取,我们定义词袋的特征空间叫做词汇表(vocabulary),针对其他文本进行词袋处理时,可以直接使用现有的词汇表:
my_vocalulary = vectorizer.vocabulary_ # 获取词汇表,术语到特征索引的映射,属于字典类型。
new_vectorizer = CountVectorizer(vocabulary=my_vocalulary)
new_corpus = ['And the first']
new_X = new_vectorizer.transform(new_corpus) # 无需再fit,直接使用transform函数
print(new_X.toarray())
print(new_vectorizer.get_feature_names())
输出:
[[1 0 1 0 0 0 1 0 0]]
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
词频与反文档频率模型(term frequency-inverse document frequency,TF-IDF),用以评估某一字词对于一个文件集或一个语料库的重要程度,字词的重要性跟它在文件中出现的次数成正比,同时跟它在语料库中出现的频率成反比。
TF-IDF的主要思想:TF-IDF是指TF乘IDF,其中词频(TF)是根据某个词或短语在一篇文章中出现的频率即词频,如果频率高,并且在其他文章中很少出现,则认为该词具有很好的区分能力;反文档频率(IDF)指:如果包含词条a的文档越少,也就说n越小,IDF越大,说明词条a具有很好的区分能力。
2.1 导包
from sklearn.feature_extraction.text import TfidfTransformer
2.2 函数介绍
class sklearn.feature_extraction.text.TfidfTransformer(*, norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)
参数:
具体关于TF-IDF的计算方法可详见scikit-learn中文社区
2.3 代码示例
TF-IDF模型常用和词袋模型配合使用,对词袋模型生成的数组进一步处理。
import numpy as np
count = [[1, 1, 1, 1, 0, 1, 0, 0],
[1, 2, 0, 1, 1, 1, 0, 0],
[1, 0, 0, 1, 0, 1, 1, 1],
[1, 1, 1, 1, 0, 1, 0, 0]]
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(count)
print(tfidf.toarray())
输出:
[[0.38408524 0.46979139 0.58028582 0.38408524 0. 0.38408524 0. 0. ]
[0.28108867 0.6876236 0. 0.28108867 0.53864762 0.28108867 0. 0. ]
[0.31091996 0. 0. 0.31091996 0. 0.31091996 0.59581303 0.59581303]
[0.38408524 0.46979139 0.58028582 0.38408524 0. 0.38408524 0. 0. ]]
虽然词袋模型能表现文本由哪些词汇组成,但是无法表达词汇直接的前后关系,词汇表模型弥补了这方面不足。
由于没有找到现成的API直接供我们使用,因此借用TensorFlow2手动实现了该方法:
import tensorflow as tf # 当前测试版本为2.3 x_text = [ 'i love you', 'me too', 'i me too' ] x_text_list = [tf.keras.preprocessing.text.text_to_word_sequence(a) for a in x_text] # 拆分 # x_text_list:[['i', 'love', 'you'], ['me', 'too'], ['i', 'me', 'too']] word_set = set() # 获取所有的单词 for text in x_text_list: for word in text: word_set.add(word) # word_set:{'i', 'love', 'me', 'too', 'you'} word_list = list(word_set) # 转换为list word_index = dict((word, word_list.index(word) + 1) for word in word_list) # 获取序号与单词的映射 # word_index:{'me': 1, 'love': 2, 'too': 3, 'you': 4, 'i': 5} x_index_list = [] for text in x_text_list: x_index_list.append([word_index.get(word, 0) for word in text]) # x_index_list:[[5, 2, 4], [1, 3], [5, 1, 3]] result = tf.keras.preprocessing.sequence.pad_sequences(x_index_list).tolist() # 统一长度 print(result) # [[5, 2, 4], [0, 1, 3], [5, 1, 3]]
最终
i love you -> [5,2,4]
me to -> [0,1,3]
i me to -> [5,1,3]
一般情况下,在深度学习模型的搭建过程中还将搭配嵌入层Embedding作为后续处理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。