我正在研究Enron数据集以对电子邮件进行分类并使用Python 3.我已经预处理了数据(标记化,删除停用词,词干),目前正在以事务和数据矩阵格式表示数据。这是我对这个过程的理解:
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).
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个单词是:懒惰,快速,狐狸,狗,上面的表格将会改变。我的理解是否正确?
答案 0 :(得分:2)
- 根据以上计算,前4个单词是什么?它是针对整个语料库还是每个文档中的首要词汇?
醇>
当您选择最高k
个单词时,它将成为您的语料库的受控词汇表(文本挖掘术语)。我鼓励你完成这个tutorial。几点重要:
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赋予不同的权重。 请记住这一点,您不是为每个文档选择前4个单词,而是从整个语料库中选择。这就是为什么使用总术语频率而不是术语频率的原因。顺便说一句,当您考虑整个语料库时,term freqeucny
和total term frequency
术语可以互换使用。
- 单词的排序是否正确?
醇>
排序是正确的。计算每个唯一术语的tf-idf权重分数(我们称之为文本挖掘中的词典术语)后,只需在摘要k
中按降序排序。你应该选择具有更高tf-idf权重的单词。如果你的想法不清楚TF和IDF,我建议你阅读这篇维基百科article。
- 假设前四个词是:懒惰,快速,快速,狐狸;如果前4个单词是:懒惰,快速,狐狸,狗,上面的表格将会改变。我的理解是否正确?
醇>
您的问题的答案是是,因为您的受控词汇表已更改,因此您的文档将会更改。选择顶部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用于对文档与搜索字符串的相关性进行排名,你真的会寻找“顶级文档”,即你的搜索词排名最高的文档。因此,您需要将计算结果改为计算每个文档的排名。在那之后,您可能不需要担心第二和第三个问题,因为文档的排名可能会有所不同,因此您可以将排名最高的排名作为答案。并且 - 不要忘记 - 您需要有一个起始字符串,您将在其中评估文档。