伪知识之通俗易懂的解释文本去重中的TF-IDF算法原理及实现方式【内向即厕所--王奕君】

纯属个人理解,内容并不完全靠谱,仅供参考

 TF-IDF是一种常用于数据挖掘的加权技术。本文会涉及到TF-IDF的代码实现和sklearn中TF-IDF的实现原理

零.词向量,词向量空间

一个已分词的文本,可以认为是一个词向量。而由所有词向量所构成的数据结构,就是词向量空间

列如:羞羞的铁拳  是一组词----通过分词

----(羞羞  的  铁拳)词向量空间

       |

     词向量

 

一.TF-IDF的作用及优点:

根据字词在文本中出现的次数和在整个语料中出现的文档频率来计算一个字词在整个语料中的重要程度。

扫描二维码关注公众号,回复: 3169482 查看本文章

它的优点是能过滤掉一些常见的却无关紧要本的词语【停用词】,同时保留影响整个文本的重要字词。

【注意】TF-IDF值越大表示该特征词对这个文本的重要性越大。

二.TF-IDF中涉及的log公式:

Log即对数函数。

注意log以10为底10的对数==1

log以10为底2的对数,代码实现

import math
x=math.log(2,10)  其中2是对数,10是底数
print(x)

res:0.30102999566398114

TF-IDF中对数的作用就是让待处理的IDF的值变小,越小越精确到0的后几位,所得到的数据才具有比较分析的实际意义。

 

三.TF的计算公式:

 

四.IDF的计算公式:

 

五.具体分析TF,IDF:

TF:表示某个词向量在词向量空间中出现的次数---即词频

IDF:表示某个特征词在文档中次数---即倒文本频率  

TF的目的是为得到特征词在词频。IDF是为了得到停用词的词频

关键词词频=TF*IDF

注意TF越大,则该词向量在词向量空间中的权重越大,

而IDF越小,表名在该词在所有文档中出现的词频越大

所以通过IDF值可以知道哪些属于停用词,达到清洗停用词的作用,从而得到文档中的最大权重又并非停用词的关键词。

 

六.向量空间模型必须在同一词汇空间:

#Conunt 快速计数,计数的结果存储在dict中。

Res:

Counter({'blue': 3, 'red': 2, 'green': 1})

【注意】:

第一次尝试量化的结果不能进行比较。这是因为它们不在同一词汇空间中。

我们真正想要的是每一篇文件的量化结果都有相同的长度,而这里的长度是由我们语料库的词汇总量决定的。

 

七:向量空间模型代码实现:

mydoclist = ['Julie loves me more than Linda loves me',
             'Jane likes me more than Julie loves me',
             'He likes basketball more than baseball']

def build_lexicon(corpus):
    lexicon = set()
    for doc in corpus:
        lexicon.update([word for word in doc.split()])
    return lexicon
def tf(term, document):
    return freq(term, document)
def freq(term, document):
    return document.split().count(term)
vocabulary = build_lexicon(mydoclist)
#res:# {'baseball', 'Jane', 'He', 'Julie', 'me', 'more',    'basketball', 'loves', 'likes', 'than', 'Linda'}

doc_term_matrix = []
print('Our vocabulary vector is [' + ', '.join(list(vocabulary)) + ']')
for doc in mydoclist:
    print('The doc is "' + doc + '"')
    # res:
    #Julie loves me more than Linda loves me
    tf_vector = [tf(word, doc) for word in vocabulary]
    # res:
    # [1, 1, 2, 0, 0, 0, 0, 1, 2, 0, 1]
    # [0, 1, 2, 1, 0, 0, 1, 1, 1, 0, 1]
    #[0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1]
    tf_vector_string = ', '.join(format(freq) for freq in tf_vector)
    # res:
    # [1, 1, 1, 1, 0, 0, 0, 2, 2, 0, 0]
    print('The tf vector for Document %d is [%s]' % ((mydoclist.index(doc) + 1), tf_vector_string)),
    doc_term_matrix.append(tf_vector)
print('All combined, here is our master document term matrix: ')
print(doc_term_matrix)
# res:
# [[1, 2, 0, 1, 0, 0, 0, 2, 1, 0, 1],
# [1, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1],
#  [0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1]]

 

八:向量空间模型的代码思想:

代码思想:

  • 得到所有的向量
  • 通过for循环,得到每个词向量在词向量空间的个数。
  • ((mydoclist.index(doc) + 1), tf_vector_string)),

获得每个词向量在每一组词向量空间中的词向量模型

  •  doc_term_matrix.append(tf_vector)

Res:  

 # [[1, 2, 0, 1, 0, 0, 0, 2, 1, 0, 1],
# [1, 2, 0, 0, 0, 1, 1, 1, 1, 0, 1],
#  [0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1]]     

 

九:sklearn中TF-IDF实现方式之TF

corpus = ['情人节 晚上',
          '高富帅 大灰狼 白富美',
          '睡觉 喜欢 睡觉']

res:['情人节 晚上', '高富帅 大灰狼 白富美', '睡觉 喜欢 睡觉']

# # #将文本中的词语转换为词频矩阵
vectorizer = CountVectorizer()
# # # #计算个词语出现的次数   进行去重去停用词计算词频
X = vectorizer.fit_transform(corpus)

Res:

  (0, 3) 1

  (0, 2) 1

  (1, 4) 1

  (1, 1) 1

  (1, 6) 1

  (2, 0) 1

(2, 5) 2

括号内的第一表示是第几组词向量空间

至于第二项表示在整个被去重去停用词以后的一个统一的词向量空间中所处的位置。

而第三项表示在统一的词向量空间中在每一组词向量空间所出现的次数

word = vectorizer.get_feature_names()
print(word)

res:

['喜欢', '大灰狼', '情人节', '晚上', '白富美', '睡觉', '高富帅']

这个统一的词向量空间就是被清洗被去重过的词向量空间,第二项的数字就来自于这个数据结构的位置

 

# # # #查看词频结果
print(X.toarray())       这个产生的过程就是建立向量模型的过程。

Res:

[[0 0 1 1 0 0 0]

 [0 1 0 0 1 0 1]      -----在这里他被称作是加权词向量空间

 [1 0 0 0 0 2 0]]

词频结果就是通过每一次对统一的词向量空间进行for循环,然后在每一组词向量空间中进行技术,得到的结果。

 

以上就是TF的所有计算方式。

 

十:sklearn中TF-IDF实现方式之IDF:

TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值

from sklearn.feature_extraction.text import CountVectorizer

 

#语料

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

corpus = ['情人节 晚上',
          '高富帅 大灰狼 白富美',
          '睡觉 喜欢 睡觉']

#将文本中的词语转换为词频矩阵                 该部分得到的是TF的值

vectorizer = CountVectorizer()

X = vectorizer.fit_transform(corpus)

word = vectorizer.get_feature_names()

print word

print X.toarray()-----加权词向量空间

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#蝴蝶很美蝴蝶终究飞不过沧海。

from sklearn.feature_extraction.text import TfidfTransformer

#类调用

transformer = TfidfTransformer()

print transformer

#将词频矩阵X统计成TF-IDF值

tfidf = transformer.fit_transform(X)

#查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重

print tfidf.toarray()

res:

 

TfidfTransformer(norm='l2', smooth_idf=True, sublinear_tf=False, use_idf=True)

[[ 0.          0.          0.70710678  0.70710678  0.          0.          0.        ]

 [ 0.          0.57735027  0.          0.          0.57735027  0.

   0.57735027]

 [ 0.4472136   0.          0.          0.          0.          0.89442719

  1. ]]

十二:TF-IDF结果获取方式:

IDF 是  log(词向量空间总数/包含该词向量的词向量空间总数)

如果TF的值是零,则TF-IDF的值也一定是0

【注意】:加权词向量空间由二维矩阵构成。

IDF(t,D)=log(|D|+1)/(DF(t,D)+1)

这里|D|表示语料库的文档总数,为了不让分母为0,在此进行了加1的平滑操作。】

the end

猜你喜欢

转载自blog.csdn.net/qq_37995231/article/details/81981254
今日推荐