解释跨文档的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)]

如果我们想找到该语料库中单词的"显着性"或"重要性",我们可以简单地完成所有文档中TF-IDF分数的总和,然后将其除以文档数量吗?

>>> 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数量数量总和的数学解释是什么?

在给定项中,对语料库中TF-IDF的解释是语料库中最高的TF-IDF。

在colpus_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

输出比较购物车:
NOTE :可以使用gensim,用corpus_tfidf创建匹配的dictionary
只能显示单词的含义。

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

这是一个很好的讨论。感谢您启动此线程。@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 ]]

如果我们仔细观察,我们意识到特征1巫婆在所有文档中都不会完全忽略,因为IDF的SklearLearn实现= log [n/df(d,t)] 1.添加了 1。所有文档中恰好发生的重要词不忽略。例如。将特定文档分类为"摩托车"(20_NewSgroup数据集)时,"自行车"一词经常出现。

  1. 现在对前两个问题的依据,一个人试图解释和理解文档中可能发生的最常见特征。在这种情况下,以某种形式汇总,包括DOC中的所有可能出现的单词都不会从数学上消除任何东西。IMO这样的查询非常有用,可以探索数据集并帮助了解数据集的意义。逻辑也可以应用于使用哈希进行矢量化。

    相关性_score =平均值(tf(t,d) * idf(t,d))=平均值(bias inital_wt * f(t,d)/max {f(t',d)}) * log(n/df(d,t)) 1))

  2. 问题3非常重要,因为它也可能有助于选择用于构建预测模型的功能。仅将TF-IDF分数独立用于特征选择可能会在多个级别上误导。采用更理论的统计检验,例如具有TF-IDF相关性分数的" CHI2"夫妇可能是一种更好的方法。这种统计测试还评估了该功能与各自目标类别的重要性。

以及将这种解释与模型学到的特征权重相结合的过程将非常有助于完全理解文本派生功能的重要性。

**这个问题在此处详细介绍要详细介绍。但是,希望以上有帮助。别人的感觉?

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

有两个上下文可以在其中计算出显着性。

  1. 语料库中的显着性
  2. 单个文档中的显着性

语料库中的显着性可以通过计算语料库中特定单词的外观或通过计算单词出现在(IDF =倒置文档频率)中的文档的计数的倒数来计算。因为拥有特定含义的单词并非无处不在。

文档中的显着性由TF_IDF计算。因为这由两种信息组成。全局信息(基于语料库)和本地信息(基于文档)。宣称"在当前文档中更重要的单词在当前文档中更为重要"不是完全正确或错误,因为它取决于单词的全球显着性。在特定的文档中,您有很多单词,例如" It,is,am,是……",具有很大的频率。但是这些单词在任何文档中都不重要,您可以将它们作为停止单词!

----编辑---

分母(= len(colpus_tfidf))是一个恒定值,如果要处理法令而不是测量的基数,则可以忽略。另一方面,我们知道IDF表示倒文档freqeuncy,因此IDF可以通过1/df重复。我们知道DF是一个语料库值,而TF是文档级别值。TF-IDF求和将文档级的TF变成语料库级TF。确实,总和等于此公式:

count( Word )/count(文档包含 Word

此测量可以称为逆散射值。当值上升时,意味着单词被收集到较小的文档子集中,反之亦然。

我相信这个公式并不是那么有用。

我以某种方式偶然发现了同一问题。我将在这里分享我的解决方案,但并不真正知道它的效果。

在计算TF-IDF之后,我们所拥有的就像术语与文档的矩阵一样。

[terms/docs : doc1  ,  doc2 , doc3..... docn
 term1      : tf(doc1)-idf, tf(doc2)-idf , tf(doc3)-idf.....
 .
 .
 .
 termn ........ ]

我们可以将列DOC1,DOC2 ... DOCN视为根据n个不同指标给出的分数。如果我们在列之间汇总,我们只是平均得分是一种天真的方式,并且不能完全代表捕获的信息。我们可以做得更好,因为这是一个顶级检索问题。一种有效的算法是Fagin的算法,并在此想法上起作用:

扫描排序列表,直到找到k个数据项在所有列表中都可以看到,然后算法可以停止,并保证到目前为止看到的所有数据项,甚至所有列表中都不存在的数据项,可以找到TOP-K数据项。

在这里排序的列表仅表示特定文档的单列变成列表,我们有n个这样的列表。因此,对每个人进行分类,然后在上面做fagins。

在此处阅读更多信息

如果我们想找到其中的单词的"显着性"或"重要性" 这个语料库,我们可以简单地完成所有TF-IDF分数的总和 文件并将其除以文件数量?如果是这样,什么是 TF-IDF得分总和单词总和的数学解释 跨文档?

如果您跨文档的TD-IDF分数求和,那么否则得分较低的术语可能会得到提升,而得分较高的条款可能会使他们的分数降低。

我认为,简单地除以文档的总数将足够正常化以解决这一点。也许将文档长度纳入标准化因子?无论哪种方式,我认为仍然需要每个域都需要调整所有此类方法。

因此,一般来说,从数学上讲,我希望您会得到不希望的平均效果。

最新更新