2017-02-16 80 views
16

首先让我们提取每学期的TF-IDF得分每份文件:解读跨文档的单词的TF-IDF得分的总和

from gensim import corpora, models, similarities 
documents = ["Human machine interface for lab abc computer applications", 
       "A survey of user opinion of computer system response time", 
       "The EPS user interface management system", 
       "System and human system engineering testing of EPS", 
       "Relation of user perceived response time to error measurement", 
       "The generation of random binary unordered trees", 
       "The intersection graph of paths in trees", 
       "Graph minors IV Widths of trees and well quasi ordering", 
       "Graph minors A survey"] 
stoplist = set('for a of the and to in'.split()) 
texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents] 
dictionary = corpora.Dictionary(texts) 
corpus = [dictionary.doc2bow(text) for text in texts] 
tfidf = models.TfidfModel(corpus) 
corpus_tfidf = tfidf[corpus] 

打印出来:

for doc in corpus_tfidf: 
    print doc 

[OUT]:

[(0, 0.4301019571350565), (1, 0.4301019571350565), (2, 0.4301019571350565), (3, 0.4301019571350565), (4, 0.2944198962221451), (5, 0.2944198962221451), (6, 0.2944198962221451)] 
[(4, 0.3726494271826947), (7, 0.27219160459794917), (8, 0.3726494271826947), (9, 0.27219160459794917), (10, 0.3726494271826947), (11, 0.5443832091958983), (12, 0.3726494271826947)] 
[(6, 0.438482464916089), (7, 0.32027755044706185), (9, 0.32027755044706185), (13, 0.6405551008941237), (14, 0.438482464916089)] 
[(5, 0.3449874408519962), (7, 0.5039733231394895), (14, 0.3449874408519962), (15, 0.5039733231394895), (16, 0.5039733231394895)] 
[(9, 0.21953536176370683), (10, 0.30055933182961736), (12, 0.30055933182961736), (17, 0.43907072352741366), (18, 0.43907072352741366), (19, 0.43907072352741366), (20, 0.43907072352741366)] 
[(21, 0.48507125007266594), (22, 0.48507125007266594), (23, 0.48507125007266594), (24, 0.48507125007266594), (25, 0.24253562503633297)] 
[(25, 0.31622776601683794), (26, 0.31622776601683794), (27, 0.6324555320336759), (28, 0.6324555320336759)] 
[(25, 0.20466057569885868), (26, 0.20466057569885868), (29, 0.2801947048062438), (30, 0.40932115139771735), (31, 0.40932115139771735), (32, 0.40932115139771735), (33, 0.40932115139771735), (34, 0.40932115139771735)] 
[(8, 0.6282580468670046), (26, 0.45889394536615247), (29, 0.6282580468670046)] 

如果我们要找到“显着性”或者这个躯体内的话,“重要性”,CAN我们简单地将所有文档中tf-idf分数的总和除以文档数量? I.e.

>>> tfidf_saliency = Counter() 
>>> for doc in corpus_tfidf: 
...  for word, score in doc: 
...   tfidf_saliency[word] += score/len(corpus_tfidf) 
... 
>>> tfidf_saliency 
Counter({7: 0.12182694202050007, 8: 0.11121194156107769, 26: 0.10886469856464989, 29: 0.10093919463036093, 9: 0.09022272408985754, 14: 0.08705221175200946, 25: 0.08482488519466996, 6: 0.08143359568202602, 10: 0.07480097322359022, 12: 0.07480097322359022, 4: 0.07411881371164887, 13: 0.07117278898823597, 5: 0.07104525967490458, 27: 0.07027283689263066, 28: 0.07027283689263066, 11: 0.060487023243988705, 15: 0.055997035904387725, 16: 0.055997035904387725, 21: 0.05389680556362955, 22: 0.05389680556362955, 23: 0.05389680556362955, 24: 0.05389680556362955, 17: 0.048785635947490406, 18: 0.048785635947490406, 19: 0.048785635947490406, 20: 0.048785635947490406, 0: 0.04778910634833961, 1: 0.04778910634833961, 2: 0.04778910634833961, 3: 0.04778910634833961, 30: 0.045480127933079706, 31: 0.045480127933079706, 32: 0.045480127933079706, 33: 0.045480127933079706, 34: 0.045480127933079706}) 

望着输出,我们可以假设,在语料库中最“显眼”的字是:

>>> dictionary[7] 
u'system' 
>>> dictionary[8] 
u'survey' 
>>> dictionary[26] 
u'graph' 

如果是这样,什么是TF-IDF的总和的数学解释文档中的分数是多少?

+0

你可以请你的'字典'的输出附加到你的问题。我想和我的'词典'做比较,这样我就可以在我的答案中更新我的输出表。 – stovfl

+0

哎呀,对不起,我没有保存它。字典会有所不同,因为我使用的是Python3,而且字典不一样,如果我重新运行它。但是单词的排名应该是确定性的,因为它基于静态计数,重新运行gensim代码,您应该得到与前3相同的“系统,调查,图表”。 – alvas

+0

对不起,不能使用gensim。 – stovfl

回答

1

有两种情况下可以在其中计算显着性。

  1. 显着性在语料库
  2. 显着性在单个文档中简单地可以通过在语料库或文档的计数的逆计数特定字的出现来计算语料库

显着性在该单词出现在(IDF =倒置文件频率)中。因为具有特定含义的词不会出现在任何地方。

文档中的显着性由tf_idf计算。因为这是由两种信息组成的。全球信息(基于语料库的)和本地信息(基于文档的)。因为它取决于词汇的全球显着性,因此认为“在文档中文档频率较大的词语更重要”并不完全对或不对。在一个特定的文件中,你有很多词,比如“它,是,是,是......”,频率很高。但是这些词在任何文档中都不重要,你可以把它们当作停词!

----编辑---

分母(= LEN(corpus_tfidf))是一个恒定值,如果你要处理的序数,而不是测量的基数可以忽略不计。另一方面,我们知道IDF意味着反向文档频率,因此IDF可以被1/DF重新表示。我们知道DF是一个语料库级别值,TF是文档级别值。 TF-IDF Summation将文档级TF转换为语料库级TF。实际上,求和等于这个公式:

计数()/计数(文档包含

该测量可以被称为逆散射值。当值增加时意味着文字被收集到文档的较小子集中,反之亦然。

我相信这个公式不是很有用。

+0

文件内部和文件间的“重要性”/“显着性”概念是TF-IDF,IDF和TFF,IDF和TF-IDF的定义是明确的。但是你没有回答什么是跨文件TF-IDF总和的解释; P – alvas

0

如果我们要找到“显着”或在 的话“重要性”这个主体,我们才能简单的做所有 文件的TF-IDF得分总和,并通过数量除以它文件?如果是这样,那么跨越文档的文字 的TF-IDF得分之和的数学解释是什么?

如果您将文档中的td-idf分数相加,那么本来分数较低的分数可能会得到提升,分数较高的分数可能会使分数下降。

我不认为简单地除以文件总数就足以解决这个问题。也许将文档长度纳入标准化因子?无论哪种方式,我认为所有这些方法仍然需要根据域进行调整。

所以,一般来说,数学上我希望你会得到一个不希望的平均效应。

+0

当在文件中汇总TF-IDF最终具有与IDF相似的数字/效果时,不会对文件标准化进行文件归档? – alvas

+0

我认为它会是相似的,但会期望准确度(根据人的判断)下降。我正在考虑体重日志N/n_term:如果文档与上下文无关,则n_term太容易偏斜。虽然,如果N足够大,这可能会好吗?也许你可以对第一个文档进行手动比较,而不用总结第一个文档? – avip

2

语料库中TF-IDF的解释是给定词语中语料库中最高的TF-IDF。

找到corpus_tfidf中的热门词汇。

topWords = {} 
    for doc in corpus_tfidf: 
     for iWord, tf_idf in doc: 
      if iWord not in topWords: 
       topWords[iWord] = 0 

      if tf_idf > topWords[iWord]: 
       topWords[iWord] = tf_idf 

    for i, item in enumerate(sorted(topWords.items(), key=lambda x: x[1], reverse=True), 1): 
     print("%2s: %-13s %s" % (i, dictionary[item[0]], item[1])) 
     if i == 6: break 

输出比较购物车:
注意:Could'n使用gensim,创建一个匹配dictionarycorpus_tfidf
只能显示Word Indizies。

Question tfidf_saliency topWords(corpus_tfidf) Other TF-IDF implentation 
--------------------------------------------------------------------------- 
1: Word(7) 0.121  1: Word(13) 0.640 1: paths   0.376019 
2: Word(8) 0.111  2: Word(27) 0.632 2: intersection 0.376019 
3: Word(26) 0.108  3: Word(28) 0.632 3: survey  0.366204 
4: Word(29) 0.100  4: Word(8)  0.628 4: minors  0.366204 
5: Word(9) 0.090  5: Word(29) 0.628 5: binary  0.300815 
6: Word(14) 0.087  6: Word(11) 0.544 6: generation 0.300815 

TF-IDF的计算总是考虑语料库。

测试使用Python 3.4.2

+0

如何定义“文档”是一个模糊的问题。我不认为文档集合中的最大tf-idf分数代表了语料库的tf-idf。 – alvas

+0

你可以给一个链接*“如何定义一个文档”是一个模糊的“*。你怎么看:Score = Sum(语料库中每学期的tf-idf) – stovfl

+0

对于语料库中的句子,句子是一个文件?或者是句组的文档?在TF-IDF的情况下,如果TF是全文范围计算(所有句子之和),那还是tf-idf?文档在语料库中用于句子的概念相当模糊。 – alvas

1

这是一个伟大的讨论。感谢您启动此线程。通过@avip包含文档长度的想法看起来很有趣。将不得不实验并检查结果。同时让我尝试以不同的方式提问。当查询TF-IDF相关性分数时,我们试图解释什么?

  1. 可能试图了解在文档级别的字相关
  2. 可能试图了解每类词相关
  3. 可能试图理解这个词相关的整体(在整个 语料库)

    # # features, corpus = 6 documents of length 3 
    counts = [[3, 0, 1], 
          [2, 0, 0], 
          [3, 0, 0], 
          [4, 0, 0], 
          [3, 2, 0], 
          [3, 0, 2]] 
    from sklearn.feature_extraction.text import TfidfTransformer 
    transformer = TfidfTransformer(smooth_idf=False) 
    tfidf = transformer.fit_transform(counts) 
    print(tfidf.toarray()) 
    
    # lambda for basic stat computation 
    summarizer_default = lambda x: np.sum(x, axis=0) 
    summarizer_mean = lambda x: np.mean(x, axis=0) 
    
    print(summarizer_default(tfidf)) 
    print(summarizer_mean(tfidf)) 
    

结果:

# Result post computing TF-IDF relevance scores 
array([[ 0.81940995, 0.  , 0.57320793], 
      [ 1.  , 0.  , 0.  ], 
      [ 1.  , 0.  , 0.  ], 
      [ 1.  , 0.  , 0.  ], 
      [ 0.47330339, 0.88089948, 0.  ], 
      [ 0.58149261, 0.  , 0.81355169]]) 

# Result post aggregation (Sum, Mean) 
[[ 4.87420595 0.88089948 1.38675962]] 
[[ 0.81236766 0.14681658 0.2311266 ]] 

如果我们仔细观察,我们意识到在所有文档中发生的feature1女巫并没有被完全忽略,因为添加了idf = log [n/df(d,t)] + 1. +1的sklearn实现这样在所有文档中碰巧发生的重要词语都不会被忽略。例如。“自行车”这个词在将特定文件归类为“摩托车”(20_新闻组数据集)时经常出现。

  1. 现在针对前两个问题,一个是试图解释和理解可能在文档中发生的最常见的功能。在这种情况下,以某种形式进行汇总(包括文档中所有可能出现的词语),即使在数学上也不会带走任何内容。 IMO这样的查询对于探索数据集并帮助理解数据集的内容非常有用。该逻辑也可以应用于使用散列的矢量化。 (t,d))=平均值((偏差+ inital_wt * F(t,d)/ max {F日志(N/df(d,t))+ 1))

  2. 问题3非常重要,因为它可能会有助于构建预测模型。仅使用TF-IDF分数独立进行特征选择可能会在多个层面产生误导。采用更加理论化的统计检验,如'chi2'加上TF-IDF相关性分数可能是更好的方法。这样的统计测试也评估了该特征对于相应目标类别的重要性。

当然,将这种解释与模型的学习特征权重结合起来,对于完全理解文本派生特征的重要性非常有帮助。

**这个问题稍微复杂一点,在这里详细介绍。但是,希望以上帮助。别人觉得什么?

参考:https://arxiv.org/abs/1707.05261

相关问题