余弦定理和新闻分类
Midnight_szx · · 科技·工程
向量的基本知识
写在最前面
学过那啥的人应该都知道,向量是多维空间中从原点出发的有向线段。
-
点积
若
n 维坐标系内有两个向量\vec{a}=(x_1, x_2, ... , x_n) ,\vec{b}=(y_1, y_2, ... , y_n) , 定义点积运算<a,b> <a,b> = \sum_{i=1}^n x_iy_i 其结果是一个标量。
若记
\vert a \vert 表示向量\vec{a} 的模长,即\vert \vec{a} \vert = \sqrt{\sum_{i=1}^n x^2_i} 那么
<a,b> 还可以由<a,b>= \vert \vec{a} \vert \cdot \vert \vec{b} \vert \cdot cos(a,b) 来计算。
向量接近程度的度量
-
两个向量的接近程度,可以用他们的夹角来度量。
比如有三个向量
\vec{v_1}=(2.5,3.5) ,\vec{v_2}=(4,4.5) 和\vec{v_3}=(-6,3) 画一下就可以发现,
\vec{v_1} 和\vec{v_2} 的夹角(通俗地说,靠近程度)远远小于它们到\vec{v_3} 的夹角。于是我们说,\vec{v_1} 和\vec{v_2} 的相似程度高于\vec{v_1} 和v_3 还有\vec{v_2} 和v_3 。把二维平面的结论扩展一下,可以得到我们比较多维空间中向量相似程度的结论:
- 记
n 维向量\vec{v_1}=(x_1, x_2, ... , x_n), \vec{v_2}=(y_1, y_2, ... , y_n) ,若它们的夹角越小,我们就说\vec{v_1} 和\vec{v_2} 越接近。
- 记
余弦
- 必修二里面讲了,假定三角形三边长为
a, b, c ,其对角为A, B,C ,则有
-
如果将三角形两边
b,c 看做以A 为起点的向量,那么上式等价于cosA=\frac{<b,c>}{\vert b \vert \cdot \vert c \vert} 三角形是平面图形,而在
n 维空间中的余弦定理还长这样cosA=\frac{<b,c>}{\vert b \vert \cdot \vert c \vert} 代入上面对
n 维向量的描述,我们可以得到- 记
n 维向量\vec{v_1}=(x_1, x_2, ... , x_n), \vec{v_2}=(y_1, y_2, ... , y_n) , 它们的夹角\theta 的余弦值可以如此计算
cos \ { }\theta \ { }= \frac{\sum_{i=1}^n x_iy_i}{ \sqrt{\sum_{i=1}^n x^2_i } \cdot \sqrt{\sum_{i=1}^n y^2_i }} 大致如此。
新闻特征向量的建立
- 记
为了做这件事,我们要弄清一个现实:
- 计算机这玩意唯一能做的事是超高速计算,他读不懂我们的文字,不能像我们一样对新闻进行文学分析,更不能弄明白新闻在讲什么。
那我们要怎么办呢。。。
计算机只能“算”新闻而没法“读”新闻,所以要先把一篇篇“新闻”量化成计算机看得懂的『数据』,再用我们提到的算法来搞清楚他们的相似度如何。
于是问题的关键变成了怎么用一组数据描述一则新闻。
先看看新闻这种文学体裁有什么特点。
- 这东西主体性超级强,不同的新闻主题对应不同的信息。
- 描述信息需要『词』,不同主题对应不同领域的词。
这么来看,不同主题的新闻用词应该不太一样。
比如说,题为『黑神话入选时代杂志最佳游戏』(这事是真的) 的新闻中,出现『GDP』、『民意』、『戒严』、『在野党』是几乎不可能的,而题为『尹锡悦支持率降至13%』(这也是真的2333) 的新闻,出现『中华文化』、『西游记』、『文化输出』、『国产3A』也很不可能。
那就好办了。
一个最朴素的想法是把新闻中每一个“词”的词频统计出来,然后每个词对应一个数,所有数用一个向量打包,就可以算了。
事实上呢?前辈们确实是这么办的。很酷。
怎么统计词频
-
朴素的想法
我们可以把各种新闻中的各个词用
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 , 直接拿它的特征向量和标准向量比一比,并将其归到相应的类中就好。标准向量的获得有两种途径,第一是人工建立,但工作量极大且不准确;第二种就是自动建立(具体方法以后讲)。
-
第二种就比较麻烦了,如果一开始没有标准参照怎么办。
没事,前辈想到了。
他们提出了一种基于自上而下不断合并的方式:
- 计算所有新闻之间两两的相似性,把相似性大于一个阈值的新闻合并成一小类。这样所有新闻就被合成了一些小类。
- 把每个小类中的新闻作为一个整体,算出小类的特征向量,再计算小类之间两两的余弦相似性,合并成大一点的小类,总数越来越小。
- 如此迭代,直到所有新闻被归为一类。搞定。