数据挖掘:以事务/数据矩阵形式表示数据

时间:2016-12-09 14:21:05

标签: python data-mining text-mining tf-idf

我正在研究Enron数据集以对电子邮件进行分类并使用Python 3.我已经预处理了数据(标记化,删除停用词,词干),目前正在以事务和数据矩阵格式表示数据。这是我对这个过程的理解:

  1. 查找每个文档中每个单词的tf-idf。
  2. 根据tfidf分数对单词进行排序。
  3. 根据得分获得最高“k”字样。
  4. 通过语料库迭代,找到每个文档中单词的顶部“k”字的交集。打印每个文档中顶部“k”字的列表,以便以事务形式获取数据。
  5. 表示每个文档中顶部“k”字的存在/不存在(1/0)表示数据矩阵形式的数据。
  6. 考虑以下3个文件:

    • doc1:快速的狐狸跳过快狗;
    • doc2:快狐跳了起来;
    • doc3:狗很懒;

    tfidf计算:

    tf("quick", doc1) = 2; 
    tf("quick", doc2) = 1; 
    idf("quick") = log(3/2) = 0.176; 
    tfidf("quick", doc1) = 2*0.176 = 0.352; 
    tfidf("quick", doc2) = 1*0.176 = 0.176; 
    
    tf("lazy", doc3) = 1;
    idf("lazy") = log(3/1) = 0.477;
    tfidf("lazy", doc3) = 1*0.477 = 0.477;
    
    tf("fox", doc1) = 1; 
    tf("fox", doc2) = 1; 
    idf("fox") = log(3/2) = 0.176; 
    tfidf("fox", doc1) = 1*0.176 = 0.176; 
    tfidf("fox", doc2) = 1*0.176 = 0.176; 
    
    tf("dog", doc1) = 1; 
    tf("dog", doc3) = 1; 
    idf("dog") = log(3/2) = 0.176; 
    tfidf("dog", doc1) = 1*0.176 = 0.176; 
    tfidf("dog", doc3) = 1*0.176 = 0.176; 
    

    因此,如果要对上述词语进行排序,其排名如下:

    lazy (0.477), quick (0.352), quick (0.176), fox(0.176), fox(0.176), dog(0.176), dog(0.176).
    

    问题:

    1. 根据以上计算,前4个单词是什么?是为了 整体语料库,或每个文件中的首字?
    2. 单词的排序是否正确?
    3. 假设前四个词是:懒惰,快速,快速,狐狸;
    4. transactional form is:  
      doc1: quick, fox, quick 
      doc2: quick, fox
      doc3: lazy
      
      data-matrix form is: 
      doc1: 1,1,0,0,1,0 (quick, fox, jump, over, quick, dog) 
      doc2: 1,1,0 (quick, fox, jump) 
      doc3: 0,1 (dog, lazy)
      

      如果前4个单词是:懒惰,快速,狐狸,狗,上面的表格将会改变。我的理解是否正确?

2 个答案:

答案 0 :(得分:2)

  
      
  1. 根据以上计算,前4个单词是什么?它是针对整个语料库还是每个文档中的首要词汇?
  2.   

当您选择最高k个单词时,它将成为您的语料库的受控词汇表(文本挖掘术语)。我鼓励你完成这个tutorial。几点重要:

  • 当您从整个语料库中选择最高k个字词时,您实际上正在考虑ttf-idf其中ttf表示总学期频率。当您考虑单个文档并计算术语的频率时,我们将其称为TF。当我们为整个语料库做同样的事情时,它就变成了TTF。

对于您的示例:

唯一的字词是:The, quick, fox, jumped, over, the, dog, was, lazy

我鼓励您在预处理数据之前将其转换为大写或小写。然后Thethe将是相同的!

如果您这样做,那么唯一的字词是:The, quick, fox, jumped, over, dog, was, lazy

总独特单词:8

每个唯一单词的术语频率为:

The = 2,1,1 | quick = 2,1,0 | fox = 1,1,0 | jumped = 1,1,0
over = 1,0,0 | dog = 1,0,1 | was = 0,0,1 | lazy = 0,0,1

语料库中的总词数:8 + 4 + 4 = 16

唯一字词的总词频(TTF)和文档频率(DF)为:

The = 4, 3 | quick = 3, 2 | fox = 2, 2 | jumped = 2, 2
over = 1, 1 | dog = 2, 2 | was = 1, 1 | lazy = 1, 1

如果我们只是将倒置文档频率(IDF)的简单定义作为IDF = Log(total documents in corpus / DF),那么每个单词的TTF-IDF权重(我们实际上称它们为TF)将变为:

The = 4 * log(3/3) = 4 * 0 = 0
quick = 3 * log(3/2) = 3 * 0.18 = 0.54
fox = 2 * log(3/2) = 2 * 0.18 = 0.36
jumped = 2 * log(3/2) = 2 * 0.18 = 0.36
over = 1 * log(3/1) = 1 * 0.48 = 0.48
dog = 2 * log(3/2) = 2 * 0.18 = 0.36
was = 1 * log(3/1) = 1 * 0.48 = 0.48
lazy = 1 * log(3/1) = 1 * 0.48 = 0.48

所以,前4个单词应该是:qucik, over, was, lazy。在计算tf-idf权重期间,您可以为tf或idf赋予不同的权重。 请记住这一点,您不是为每个文档选择前4个单词,而是从整个语料库中选择。这就是为什么使用总术语频率而不是术语频率的原因。顺便说一句,当您考虑整个语料库时,term freqeucnytotal term frequency术语可以互换使用。

  
      
  1. 单词的排序是否正确?
  2.   

排序是正确的。计算每个唯一术语的tf-idf权重分数(我们称之为文本挖掘中的词典术语)后,只需在摘要k中按降序排序。你应该选择具有更高tf-idf权重的单词。如果你的想法不清楚TF和IDF,我建议你阅读这篇维基百科article

  
      
  1. 假设前四个词是:懒惰,快速,快速,狐狸;如果前4个单词是:懒惰,快速,狐狸,狗,上面的表格将会改变。我的理解是否正确?
  2.   

您的问题的答案是,因为您的受控词汇表已更改,因此您的文档将会更改。选择顶部k字后,为其指定一个索引值。然后,如果词汇表中的特定单词出现在文档中,则需要放置1,否则0。您也可以使用Term-Frequency而不是仅使用1

注意,您的数据矩阵错误,因为您选择了前四个单词作为受控词汇表,每个文档表示的长度也应该是4。因此,例如,如果我们的受控词汇表是:qucik, over, was, lazy,则文档表示应如下所示。

doc1: 1 1 0 0 ['was', 'lazy' missing]
doc2: 1 0 0 0 ['over', 'was', 'lazy' missing]
doc3: 0 0 1 1 ['was', 'lazy' missing]

您可以使用Term-Frequency生成相同内容。只需将术语 - 频率(相对于单个文档)而不是1。例如,文档1的表示将如下所示:2, 1, 0, 0 ['quick' appears twice]

请记住遵循受控词汇表的特定序列。这就是为什么我说,给每个受控词汇表术语一个索引号。例如,在我提供的示例中,我使用了:quick = 0, over = 1, was = 2, lazy = 3

还有一件事,我想通知您,您跟踪表示文档的方式称为Bag-of-Words表示。非常有趣,我鼓励你阅读相关文档。

希望我的回答能帮到你。

答案 1 :(得分:1)

对于你的第一个问题,因为tf-idf用于对文档与搜索字符串的相关性进行排名,你真的会寻找“顶级文档”,即你的搜索词排名最高的文档。因此,您需要将计算结果改为计算每个文档的排名。在那之后,您可能不需要担心第二和第三个问题,因为文档的排名可能会有所不同,因此您可以将排名最高的排名作为答案。并且 - 不要忘记 - 您需要有一个起始字符串,您将在其中评估文档。