数据挖掘:以 transactional/data 矩阵形式表示数据

Data mining: Representing data in transactional/data matrix form

我正在使用 Enron 数据集对电子邮件进行分类并使用 Python 3. 我已经对数据进行了预处理(标记化、删除停用词、词干提取),目前致力于在交易和数据矩阵格式。这是我理解的过程:

  1. 为每个文档中的每个单词查找 tf-idf。
  2. 根据 tfidf 分数对单词进行排序。
  3. 根据分数获得前 "k" 个单词。
  4. 遍历语料库并找到前 "k" 个词与每个文档中的词的交集。打印每个文档中排名靠前的 "k" 个单词的列表,以获取交易形式的数据。
  5. 表示每个文档中前"k"个词的presence/absence(1/0)表示数据矩阵形式的数据。

考虑以下 3 个文档:

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个词是:lazy, quick, quick, fox;
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 个词是:lazy、quick、fox、dog,则以上表格会发生变化。我的理解正确吗?

对于您的第一个问题,由于 tf-idf 用于对文档与搜索字符串的相关性进行排名,您实际上是在寻找 "top documents",即您的搜索词总体排名最高的文档。因此,您需要颠覆计算并计算每个文档的排名。在那之后,你可能甚至不需要担心你的第二个和第三个问题,因为文档的排名可能不同,所以你可以只选择排名最高的一个作为答案。并且 - 不要忘记 - 您需要有一个起始字符串,您将根据该字符串评估文档。

  1. Based on above calculation, what are the top 4 words? Is it for the overall corpus, or the top word in every document?

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

  • 当您从整个语料库中 selecting 顶部 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 赋予不同的权重。 记住这一点,您不是select每个文档的前 4 个词,而是整个语料库中的前 4 个词。这就是为什么使用总词频而不是词频。顺便说一下,当你考虑整个语料库时,term freqeucnytotal term frequency 术语可以互换使用。

  1. Is the sorting of the words correct?

排序正确。一旦你计算了每个独特术语的 tf-idf 权重分数(我们在文本挖掘中称之为字典术语),只需 将它们按降序排序 在 pick top k 中。您应该选择 tf-idf 权重较高的词。如果你对 TF 和 IDF 的想法不清楚,我鼓励你阅读这个维基百科 article.

  1. Suppose the top 4 words are: lazy, quick, quick, fox; Above forms will change if the top 4 words were to be: lazy, quick, fox, dog. Is my understanding correct?

您的问题的答案是,因为您的受控词汇表已更改,因此您的文档表示也将更改。一旦你 select 前 k 个单词,为它们分配一个索引值。如果词汇表中的特定单词出现在文档中,则需要输入 1,否则 0。您还可以使用 Term-Frequency 而不是只放置 1.

请注意,您的数据矩阵是错误的,因为您将前 4 个词作为受控词汇select,每个文档表示的长度也应为 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 表示。它非常有趣,我鼓励您阅读有关它的文档。

希望我的回答对您有所帮助。