文本分析是机器学习算法的主要应用领域。由于大部分机器学习算法只能接收固定长度的数值型矩阵特征,导致文本字符串等并不能直接被使用,针对此问题scikit-learn提供了将文本转化为数值型特征的方法,今天就一起来学习下。
scikit-learn中的sklearn.feature_extraction.text提供了将文本转化为特征向量的工具:
CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在第i个文本下的词频。即各个词语出现的次数,通过get_feature_names()可看到所有文本的关键字,通过toarray()可看到词频矩阵的结果。
示例:
from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'This is the first document.', 'This is the second second document.', 'And the third one.', 'Is this the first document?', ] vectorizer = CountVectorizer() count = vectorizer.fit_transform(corpus) print(vectorizer.get_feature_names()) print(vectorizer.vocabulary_) print(count.toarray()) # 输出 # ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this'] # {'this': 8, 'is': 3, 'the': 6, 'first': 2, 'document': 1, 'second': 5, 'and': 0, 'third': 7, 'one': 4} # [[0 1 1 1 0 0 1 0 1] # [0 1 0 1 0 2 1 0 1] # [1 0 0 0 1 0 1 1 0] # [0 1 1 1 0 0 1 0 1]]
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=)
参数说明:
属性:
方法:
TfidfTransformer是统计CountVectorizer中每个词语的tf-idf权值。
示例:
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer corpus = [ 'This is the first document.', 'This is the second second document.', 'And the third one.', 'Is this the first document?', ] vectorizer = CountVectorizer() transformer = TfidfTransformer() count = vectorizer.fit_transform(corpus) tfidf_matrix = transformer.fit_transform(count) print(tfidf_matrix.toarray()) # 输出 # [[0. 0.43877674 0.54197657 0.43877674 0. 0. # 0.35872874 0. 0.43877674] # [0. 0.27230147 0. 0.27230147 0. 0.85322574 # 0.22262429 0. 0.27230147] # [0.55280532 0. 0. 0. 0.55280532 0. # 0.28847675 0.55280532 0. ] # [0. 0.43877674 0.54197657 0.43877674 0. 0. # 0.35872874 0. 0.43877674]]
class sklearn.feature_extraction.text.TfidfTransformer(norm=’l2’, use_idf=True, smooth_idf=True, sublinear_tf=False)
参数:
属性:
方法:
将原始文档的集合转化为tf-idf特性的矩阵,相当于CountVectorizer配合TfidfTransformer使用的效果。即TfidfVectorizer类将CountVectorizer和TfidfTransformer类封装在一起。
示例:
from sklearn.feature_extraction.text import TfidfVectorizer corpus = [ 'This is the first document.', 'This is the second second document.', 'And the third one.', 'Is this the first document?', ] tfidf_vec = TfidfVectorizer() tfidf_matrix = tfidf_vec.fit_transform(corpus) print(tfidf_vec.get_feature_names()) print(tfidf_vec.vocabulary_) print(tfidf_matrix.toarray()) # 输出 # ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this'] # {'this': 8, 'is': 3, 'the': 6, 'first': 2, 'document': 1, 'second': 5, 'and': 0, 'third': 7, 'one': 4} # [[0. 0.43877674 0.54197657 0.43877674 0. 0. # 0.35872874 0. 0.43877674] # [0. 0.27230147 0. 0.27230147 0. 0.85322574 # 0.22262429 0. 0.27230147] # [0.55280532 0. 0. 0. 0.55280532 0. # 0.28847675 0.55280532 0. ] # [0. 0.43877674 0.54197657 0.43877674 0. 0. # 0.35872874 0. 0.43877674]]
单词频率和权重是很有用的,但是当词汇表变得很大时,以上两种方法就会出现局限性。反过来,这将需要巨大的向量来编码文档,并对内存要求很高,而且会减慢算法的速度。一种很好的方法是使用单向哈希方法来将单词转化成整数。好处是该方法不需要词汇表,可以选择任意长的固定长度向量。缺点是哈希量化是单向的,因此无法将编码转换回单词(对与许多有监督的学习任务来说或许并不重要)。
HashingVectorizer 类实现了这一方法,所以可以使用它对单词进行连续哈希量化,然后按需求词条化和编码文档。下面是对单一文档使用 HashingVectorizer 进行编码的示例。我们选择了一个固定长度为 20 的任意向量。这个值对应哈希函数的范围,小的值(例如 20)可能会导致哈希碰撞。在之前的计算机科学课程中,我们介绍过一些启发式算法,可以根据估计的词汇量来选择哈希长度和碰撞概率。
注意这种量化方法不要求调用函数来对训练数据文件进行拟合。相反,在实例化之后,它可以直接用于编码文档。
from sklearn.feature_extraction.text import HashingVectorizer text = ["The quick brown fox jumped over the lazy dog."] vectorizer = HashingVectorizer(n_features=20) vector = vectorizer.transform(text) print(vector.shape) print(vector.toarray())
运行该示例代码可以把样例文档编码成一个含有 20 个元素的稀疏矩阵。编码文档的值对应于正则化的单词计数,默认值在 -1 到 1 之间,但是可以修改默认设置,然后设置成整数计数值。
(1, 20) [[ 0. 0. 0. 0. 0. 0.33333333 0. -0.33333333 0.33333333 0. 0. 0.33333333 0. 0. 0. -0.33333333 0. 0. -0.66666667 0. ]]
参考链接:
The post scikit-learn中的文本特征提取 appeared first on 标点符.
Related posts: