想要利用计算机对自然语言进行处理,需要解决的第一件事便是自然语言的存储和计算问题。最自然和直观的方式便是采用String类型。在String类型的表示下,自然语言的处理往往是基于规则的方式——例如文本情感分类中(褒义或贬义),可以将“喜欢”、“优秀”等设置为褒义,“厌恶”、“蛮横”设置为贬义词,最简单的分类规则可以采用文本中褒义贬义词的个数对比——出现褒义词更多的句子是褒义,反之贬义。基于规则的做法极其依赖专家的经验总结,耗费大量人力物力,也受到专家经验和规则抽象能力的限制,为了解决这个问题,基于机器学习的向量表示方法应运而生。
One-Hot表示
词的独热表示是一种最简单最直接的词的向量化表示方式。主要步骤包含两步:
- 对需要用到的文本中所有词进行编码(假设共用N个词),每个词有唯一的下标(0~N)。
- 根据词下标 i 生成一个长度为N的向量,除了第i位为1外,其他位都为0。
下面举个简单的例子进行说明:
How are you?
Fine, thanks. And you?
I am fine, too.
忽略大小写,我们对不同的词进行编码:
word_dict = {0: 'am', 1: 'and', 2: 'are', 3: 'fine', 4: 'how', 5: 'i', 6: 'thanks', 7: 'too', 8: 'you'}
显然,根据不同词个数(9个),我们需要构建的One-Hot向量长度为9:
词 | 编码 | One-Hot表示 |
am | 0 | [1, 0, 0, 0, 0, 0, 0, 0, 0] |
and | 1 | [0, 1, 0, 0, 0, 0, 0, 0, 0] |
are | 2 | [0, 0, 1, 0, 0, 0, 0, 0, 0] |
fine | 3 | [0, 0, 0, 1, 0, 0, 0, 0, 0] |
how | 4 | [0, 0, 0, 0, 1, 0, 0, 0, 0] |
i | 5 | [0, 0, 0, 0, 0, 1, 0, 0, 0] |
thanks | 6 | [0, 0, 0, 0, 0, 0, 1, 0, 0] |
too | 7 | [0, 0, 0, 0, 0, 0, 0, 1, 0] |
you | 8 | [0, 0, 0, 0, 0, 0, 0, 0, 1] |
One-Hot表示 简要分析
优点:
- 词向量生成方式简单、生成速度快。
缺点:
- 每个词相互独立,无法计算词的相似度。
- 容易导致数据稀疏问题,训练数据有限时无法学到足够的信息。