我如何统计词频

2026-02-13 04:02:20

如何统计词频

Midnight_szx

·

2024-12-06 21:06:46

·

科技·工程

朴素的想法

我们可以把各种新闻中的各个词用 F=\frac{在某一篇文章的出现次数}{文章总词数} 来得到一个频率,那么一个词的词频可以是

F_i=\frac{\sigma(t_i)}{\sigma( t)}

那对于一则新闻而言,我们不妨用一个暴力的想法,现代汉语大概64000个词,把每个词在新闻中的词频都统计一遍,然后直接余弦暴算。

但存在一些问题,如下:

诸如“的”,“是”,“和”这样的虚词和“因此”,“所以”,“非常”一类的东西,对余弦的计算来说其实是一种噪声,会干扰到分类结果的准确性。怎么解决?

一篇新闻里,不同的词对最终结果的影响的权重是不一样的。比如政治类新闻中,“大选”“支持率”“战争”一类的词应该比“应用”“公民”“社会”要重要一些。这样的权重又要如何分配?

正好学了对数,可以讲 TF-IDF 了

这个缩写的全称是 $Term \: Frequency - Inverse\:Document\:Frequency$ , 翻译过来是『单文本词频-逆文本频率指数』。

其实没必要搞清楚这名词啥意思,直接来看咋用的就可以。

如何确定一个词的权重?

这个权重的设定应该满足这样的条件:

其对新闻主题的影响越大,权重就应该越大。比如,“尹锡悦宣布韩进入戒严状态”这个词,倘若在文章中看到“戒严”,大概就知道又是韩国的事儿;而看到“状态”,还是不知道讲的是什么。所以,“戒严”的权重应该比“状态”高。

各种虚词和“噪声”词的权重为零。

显然,一个词如果在很少的文章出现,其对文章主题的把握就会比在很多文章中都出现的词更强。概括地讲,若一个词 t 在 D_t 篇文章中出现过,那么 D_t 越大,t 的权重要越小,反之亦然。

如今使用的最多的权重是 IDF ,它的公式是

w=lg(\frac{D}{D_t})

其中 D 是全部文章数。

利用 IDF ,上述对于词频的计算,要更新成

F_i=\frac{\sigma(t_i)}{\sigma( t)} \cdot lg(\frac{D}{D_t})

这么做有一个很显著的好处,就是把各种“噪声词”优化掉了,同时根据对数运算的性质,越关键的词被赋予的权重越高,挺好的。

终于可以开讲新闻分类了

考虑统计一篇新闻中所有词的加权词频,然后按词典表的顺序列一个六万多维的向量。不难想象,和新闻主题相关性高的词,其加权词频会很大,向量的方向也将主要由这些参数决定。

对新闻“向量化”后,计算新闻的相似性也就成了可能。

接下来的算法可分为两种。

第一种是,假定我们已经知道了一些新闻的特征向量,那对于一条要被分类的新闻 N , 直接拿它的特征向量和标准向量比一比,并将其归到相应的类中就好。

标准向量的获得有两种途径,第一是人工建立,但工作量极大且不准确;第二种就是自动建立(具体方法以后讲)。

第二种就比较麻烦了,如果一开始没有标准参照怎么办。

没事,前辈想到了。

他们提出了一种基于自上而下不断合并的方式:

计算所有新闻之间两两的相似性,把相似性大于一个阈值的新闻合并成一小类。这样所有新闻就被合成了一些小类。

把每个小类中的新闻作为一个整体,算出小类的特征向量,再计算小类之间两两的余弦相似性,合并成大一点的小类,总数越来越小。

如此迭代,直到所有新闻被归为一类。搞定。