机器学习笔记-TF-IDF统计方法
TF-IDF统计方法
简介
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
其主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TFIDF实际上是:
T
F
?
I
D
F
TF * IDF
TF?IDF TF为词频(Term Frequency),指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。
IDF为逆向文件频率(Inverse Document Frequency),某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:
i
d
f
(
t
)
=
l
o
g
[
(
1
+
n
)
/
(
1
+
d
f
(
t
)
)
]
+
1
idf(t) = log[(1+n)/(1+df(t))] + 1
idf(t)=log[(1+n)/(1+df(t))]+1 某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
通过scikit-learn使用TF-IDF方法
在scikit-learn中,TFIDF算法的归一化由TfidfTransformer类实现。它可以将一个词频矩阵以归一化后的tf或tf-idf形式呈现。
>>> from sklearn.feature_extraction.text import TfidfTransformer
>>> transformer = TfidfTransformer(smooth_idf=False)
>>> transformer
TfidfTransformer(smooth_idf=False)
如果smooth_idf为True,则idf公式的分母+1,否则不加。
fit(X[, y])
fit_transform(X[, y])
CountVectorizer是属于常见的特征数值计算类,是一个文本特征提取方法。对于每一个训练文本,它只考虑每种词汇在该训练文本中出现的频率。
CountVectorizer会将文本中的词语转换为词频矩阵,它通过fit_transform函数计算各个词语出现的次数。
>>> from sklearn.feature_extraction.text import CountVectorizer
>>> vectorizer = CountVectorizer()
>>> vectorizer
CountVectorizer()
用它来对一个由文本文档组成的简约文集进行标记和词频统计:
>>> corpus = [
... 'This is the first document.',
... 'This is the second second document.',
... 'And the third one.',
... 'Is this the first document?',
... ]
>>> X = vectorizer.fit_transform(corpus)
>>> X
<4x9 sparse matrix of type '<... 'numpy.int64'>'
with 19 stored elements in Compressed Sparse ... format>
>>> analyze = vectorizer.build_analyzer()
>>> analyze("This is a text document to analyze.") == (
... ['this', 'is', 'text', 'document', 'to', 'analyze'])
True
在拟合过程中,分析器会找到并分配一个唯一的整数索引给每个词语,该索引对应于所得矩阵中的一列。可以按以下方式检索这些列的解释:
>>> vectorizer.get_feature_names() == (
... ['and', 'document', 'first', 'is', 'one',
... 'second', 'the', 'third', 'this'])
True
>>> X.toarray()
array([[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]]...)
查看语料库大小:
vocab = vectorizer.vocabulary_
vocab_len = len(vocab)
将来在对transform方法进行调用时,训练语料库中未出现的单词将被完全忽略:
>>> vectorizer.transform(['Something completely new.']).toarray()
array([[0, 0, 0, 0, 0, 0, 0, 0, 0]]...)
在前一语料库中,第一个文档和最后一个文档恰好具有相同的词,因此被编码为相等的向量。特别是,我们失去了最后一个文档是疑问形式的信息。为了保留本地指令信息,除了提取单个词之外,我们还可以提取 2-grams 的单词:
>>> bigram_vectorizer = CountVectorizer(ngram_range=(1, 2),
... token_pattern=r'\b\w+\b', min_df=1)
>>> analyze = bigram_vectorizer.build_analyzer()
>>> analyze('Bi-grams are cool!') == (
... ['bi', 'grams', 'are', 'cool', 'bi grams', 'grams are', 'are cool'])
True
TfidfVectorizer将原始文档集合转换为TF-IDF特性的矩阵,相当于CountVectorizer 后面跟着TfidfTransformer。使用方法类似CountVectorizer。
def transfer2TfidfVector():
'''
使用TfidfVectorizer方法提取特征向量,并将向量化转换器应用到新的测试数据
TfidfVectorizer()方法的参数设置:
min_df = 2,stop_words="english"
test_data - 需要转换的原数据
返回值:
transfer_test_data - 二维数组ndarray
'''
test_data = ['Once again, to not believe in God is different than saying\n>I BELIEVE that God does not exist. I still maintain the position, even\n>after reading the FAQs, that strong atheism requires faith.\n>\n \nNo it in the way it is usually used. In my view, you are saying here that\ndriving a car requires faith that the car drives.\n \n...']
transfer_test_data = None
vectorizer = TfidfVectorizer(min_df = 2, stop_words = "english")
'''
stop_words_ 被忽略的术语
min_df float in range [0.0, 1.0] or int, default=1
在构建词汇表时,忽略那些文档频率严格低于给定阈值的术语。这个值在文献中也称为cut-off。如果是浮点数,则该参数表示文档的比例,整数 绝对计数。如果词汇表不是None,则忽略此参数。
'''
vectorizer.fit(X)
transfer_test_data = vectorizer.transform(test_data).toarray()
return transfer_test_data
|