中文文本中的数据可能会乱七八糟,比如各种乱码、符号等,都需要去掉,我认为基本的标准就是能保证文本的格式和内容能像一个正常的文章供人阅读。
中文文本数据在处理过程,第一步一般都是需要进行分词,这在英文文本分词中叫 tokenization ,基本的思想就是将文本分成一个个词或者字,由于中文不像英文天生有空格作为分隔符,所以中文分词是一个很大的研究领域,目前可以借助常用的如 jieba 等成熟的分词器进行中文文本的分词。
文本都是一些非结构化数据,我们需要先将这些数据转化为结构化数据,结构化数据就可以转化为数学问题了,这种思想也是机器学习的思想,而分词就是转化的第一步。如下进行句子的简单分词:
乒乓球 \ 卖完 \ 了
另外词是表达完整含义的最小单位。字的粒度太小,无法表达完整含义,而句子的粒度又太大,承载的信息量多,无法准确建模。
首先,大部分低频词是很少被用到的,比如人名、错词、“的”等无意义字。
其次,去掉低频词可以使得字典不会太大,如果使用 one-hot 向量,则维度和字典大小相等,字典越大,one-hot 向量的维度越大,这会让计算变慢,并且增加存储。而且 one-hot 向量的维度越大,在模型中所需要的参数也会更多,容易造成 over fitting
在实际的文本处理过程中,我们需要将其中的分词变成机器学习或者深度学习用到的数值特征,这样才能方便计算机进行运算,如我们可以将分词“印度”为 1 ,“美国”为 2 等等,这里的数字仅仅是表示类别,并不具备数值比较大小的功能。所以进一步用一个 one-hot 向量表示国家或者性别,如:
“印度”->[0,0,0,1]
“美国”->[0,0,1,0]
当我们在表示一个国家的时候,为什么要用 one-hot 向量表示特征,如:
“印度”->[0,0,0,1]
“美国”->[0,0,1,0]
“中国”->[0,1,0,0]
“英国”->[1,0,0,0]
而不是直接用数字表示特征,如:
“印度”->1
“美国”->2
“中国”->3
"英国"->4
有同学可能会觉得,直接用数字表示每个国家的时候,用 1 个数字就可以轻松解决,还可以省下 4 位向量的存储和计算,不是很划算的设计吗?当然不行了,要不然就不会出现 one-hot 向量了!
如果我们真的用数字进行表示,我们用前面例子的基础上,进行下面的计算:
美国(2)+ 印度(1)= 中国(3)
这样的特征计算完全不合理,美国和印度的和怎么可能是中国呢?如果我们用向量进行计算:
美国[0,0,1,0]+ 印度[0,0,0,1] = [0,0,1,1]
[0,0,1,1,] 这个结果的含义则比较丰富,说明结果中既有美国又有印度。
总之,在机器学习或者深度学习中的运算,不能用标量进行特征表示,因为在特征的运算过程中数字得到的结果是没有意义的。正确的做法都是使用向量进行特征表示。
假如我们有一万个不同的词,我们用 one-hot 表示每个词都需要一万维的向量,这种大维度的向量需要耗费高昂的计算资源,所以我们只建议在少量的词时使用,在很多词的情况下,已经不再使用,这时我们要进行词嵌入 word embbeding ,将这些高维的向量映射成低维向量。具体做法如下:
词的 one-hot 向量(1*10000)* P(10000*10)= V(1*10)
我们将一个词的 one-hot 高维向量乘到 P 矩阵上,这里 P 为词的个数乘自定义为 10 维的矩阵,P 需要从训练数据中学习,每一行表示一个词的词向量,最终经过上面例子中的矩阵计算得到一个结果向量 V ,其大小为一个 10 维向量,简单说就是将之前一万维的向量压缩转换为一个 10 维的向量,这样就可以方便进行计算。
中文文本的处理过程,通常是如下过程:
预处理 --> 分词 ——> 去停用词 --> 用向量表示分词