本次实验要求处理给定的数据集,得到对应的 onehot,TF,TF_IDF 矩阵,还要将 onehot 矩阵转为三元矩阵的形式,并完成三元矩阵相加的功能。 我的思路是:
<1>建立单词集和单词表:先按行读入数据集,由于一行中,两个 tab 之间的数据是无 用的,因此舍弃掉前面的数据后,按照空格分隔字符串,得到一个个的单词,每分隔出一个 单词,就将其加入到单词集 word_set 和单词表 word_list 中(word_list 中的单词按出现顺序 存储,且不重复;word_set 中的单词即按照单词出现的顺序存储,可重复,且不同行的单 词之间用字符“#”隔开)
<2>建立矩阵 matrix 和 onehot(matrix[i][j]表示第 i 篇文章中,在单词表上位置为 j 的 单词出现的次数,其目的是方便后面写 TF 矩阵):方法是通过简单的遍历,将 word_set 中 的每一个单词与 word_list 中的单词作对照,找到单词在单词表中的位置 n,同时根据遍历过 的“#”字符的数目确定行数 m,最后另 onehot[m][n] 位置为 1,另 matrix[m][n]的位置 的数值递增 1; <3>建立矩阵 TF: TF 矩阵表示的是每一行文本中的每一个值标志对应的词语出现的次数 归一化,根据 matrix 矩阵很容易转化得到 TF 矩阵,只需要先将 matrix 矩阵同一行上的值全 部相加,再用该单词出现的次数除以这个求和的结果即得到 TF 矩阵对应位置的值。
<4>建立矩阵 TF-IDF:TF 矩阵代表的是某个单词在一个文本上的出现频率,一般来说,出 现的频率越高,该单词在该文本的重要性就越大,但是有些不怎么重要的单词(例如冠词, 语气助词等)往往在多数文本中出现的频率都会很大,为了排除这一干扰,引入了 TF-IDF 矩阵(其原理在思考题中叙述),得到该矩阵首先要计算 idf 的值,根据公式:
文本总数 D 就是矩阵的行数, j 的值(出现了该单词的文章总数)可以由 onehot 矩阵每一列 上所有为 1 的值的个数得到,由此可以计算 idf 的值,然后再将 TF 矩阵上的每个值与对应的 idf 值