文本数据集的简单处理(将文本转化为one-hot、TF、TF-IDF矩阵)

本次实验要求处理给定的数据集,得到对应的 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 值相乘即得到 TF-IDF 矩阵


<5>实现三元顺序表:得到 onehot 矩阵后,发现这是一个稀疏矩阵,用普通的二维数组 方式存储浪费了内存空间,因此用三元顺序表存储,我已经提前记录好了行数,列数,和非 零元素个数,先将这三个数值写入文件,再遍历 onehot 矩阵,遇到非零元素就记录其行号, 列号和元素的值,按顺序写入文件中 

<6>实现三元顺序表加法:首先构建一个类 item,有三个数据成员 x,y,num 用于存储 元素的行号,列号和值(用 int 存储),用一个 vector 容器存储矩阵相加后的所有 item,然 后按行读文本文件,对字符串进行分割,分割出行号列号和元素值,将这三个熟悉个由字符 串转为 int 后,赋给一个 item 对象的数据成员,然后通过遍历,在 vector 中查找是否已有同 一位置(行号列号相同)的 item 存在,如果有,则将两个 item 的 num 值相加即可,如果没 有,则将新 item 压入 vector 中,最后,在重载了<运算符的前提下,直接调用 sort 函数,使 得容器中的元素按要求排列,最后,将 vector 中的 item 按格式写入结果文件中即可


1.IDF 的第二个计算公式中分母多了个 1 是为什么? 因为如果一个词在所有文章中都没出现,就会导致分母为 0,因此分母中加一个 1 避免这种 情况

2.IDF 数值有什么含义?TF-IDF 数值有什么含义? IDF 值是逆向文件频率,有的词(比如了,的,啊......)在所有文档中都有较高的出现频率,
人工智能实验 单独用词频 TF 确定词条的重要性有一定局限性,在引入 IDF 后,如果包含某词条的文档数 越少,则 IDF 值越大,则说明词条具有比较高的辨识度,有较强的的文章类别区分能力。 这样 TF-IDF 的值就可以过滤掉一般的词语,表征词条在一篇文章中的重要性。
3. 为什么要用三元顺序表表达稀疏矩阵? 传统二维数组存储稀疏矩阵,如果数据量较大的话,会造成存储空间的浪费,三 元顺序表只记录非零元素的信息,可以节省存储空间

你可能感兴趣的:(文本数据集的简单处理(将文本转化为one-hot、TF、TF-IDF矩阵))