数据挖掘:以 transactional/data 矩阵形式表示数据
Data mining: Representing data in transactional/data matrix form
我正在使用 Enron 数据集对电子邮件进行分类并使用 Python 3. 我已经对数据进行了预处理(标记化、删除停用词、词干提取),目前致力于在交易和数据矩阵格式。这是我理解的过程:
- 为每个文档中的每个单词查找 tf-idf。
- 根据 tfidf 分数对单词进行排序。
- 根据分数获得前 "k" 个单词。
- 遍历语料库并找到前 "k" 个词与每个文档中的词的交集。打印每个文档中排名靠前的 "k" 个单词的列表,以获取交易形式的数据。
- 表示每个文档中前"k"个词的presence/absence(1/0)表示数据矩阵形式的数据。
考虑以下 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).
问题:
- 根据上面的计算,前4个词是什么?是为了
总体语料库,还是每个文档中的顶部单词?
- 单词排序正确吗?
- 假设前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",即您的搜索词总体排名最高的文档。因此,您需要颠覆计算并计算每个文档的排名。在那之后,你可能甚至不需要担心你的第二个和第三个问题,因为文档的排名可能不同,所以你可以只选择排名最高的一个作为答案。并且 - 不要忘记 - 您需要有一个起始字符串,您将根据该字符串评估文档。
- 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
我鼓励您在预处理数据之前,将它们转换为大写或小写。那么The
和the
就一样了!
如果你这样做,那么独特的单词是: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 freqeucny
和 total term frequency
术语可以互换使用。
- Is the sorting of the words correct?
排序正确。一旦你计算了每个独特术语的 tf-idf 权重分数(我们在文本挖掘中称之为字典术语),只需 将它们按降序排序 在 pick top k
中。您应该选择 tf-idf 权重较高的词。如果你对 TF 和 IDF 的想法不清楚,我鼓励你阅读这个维基百科 article.
- 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 表示。它非常有趣,我鼓励您阅读有关它的文档。
希望我的回答对您有所帮助。
我正在使用 Enron 数据集对电子邮件进行分类并使用 Python 3. 我已经对数据进行了预处理(标记化、删除停用词、词干提取),目前致力于在交易和数据矩阵格式。这是我理解的过程:
- 为每个文档中的每个单词查找 tf-idf。
- 根据 tfidf 分数对单词进行排序。
- 根据分数获得前 "k" 个单词。
- 遍历语料库并找到前 "k" 个词与每个文档中的词的交集。打印每个文档中排名靠前的 "k" 个单词的列表,以获取交易形式的数据。
- 表示每个文档中前"k"个词的presence/absence(1/0)表示数据矩阵形式的数据。
考虑以下 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).
问题:
- 根据上面的计算,前4个词是什么?是为了 总体语料库,还是每个文档中的顶部单词?
- 单词排序正确吗?
- 假设前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",即您的搜索词总体排名最高的文档。因此,您需要颠覆计算并计算每个文档的排名。在那之后,你可能甚至不需要担心你的第二个和第三个问题,因为文档的排名可能不同,所以你可以只选择排名最高的一个作为答案。并且 - 不要忘记 - 您需要有一个起始字符串,您将根据该字符串评估文档。
- 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
我鼓励您在预处理数据之前,将它们转换为大写或小写。那么The
和the
就一样了!
如果你这样做,那么独特的单词是: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 freqeucny
和 total term frequency
术语可以互换使用。
- Is the sorting of the words correct?
排序正确。一旦你计算了每个独特术语的 tf-idf 权重分数(我们在文本挖掘中称之为字典术语),只需 将它们按降序排序 在 pick top k
中。您应该选择 tf-idf 权重较高的词。如果你对 TF 和 IDF 的想法不清楚,我鼓励你阅读这个维基百科 article.
- 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 表示。它非常有趣,我鼓励您阅读有关它的文档。
希望我的回答对您有所帮助。