NLP one-hot编码

本文为[365天深度学习训练营学习记录博客\n 参考文章:365天深度学习训练营\n 原作者:[K同学啊 | 接辅导、项目定制]\n 文章来源:[K同学的学习圈子](https://www.yuque.com/mingtian-fkmxf/zxwb45)

one-hot编码

独热编码(One-Hot Encoding)是一种处理类别型数据的常用编码方式。在机器学习中,经常需要处理非数字数据,例如颜色、国家名、产品类别等。由于大多数算法都是基于数学运算的,这就需要将这些非数字的类别数据转换为数值形式。

独热编码的基本思想是将一个类别型变量转换为一个或多个二进制特征来表示。这些特征的数量通常与原始数据中的类别数量相等。每一个类别都由一个特征向量表示,这个向量中只有一个元素是1,表示当前的类别,其余元素都是0。

例如,如果有一个颜色的类别型变量包含红、绿、蓝三个值,独热编码会为每个颜色创建一个新的二进制特征:

  • 红色可能编码为:[1, 0, 0]
  • 绿色可能编码为:[0, 1, 0]
  • 蓝色可能编码为:[0, 0, 1]

这种编码方式使得类别型数据更容易被计算机理解和处理,同时也保证了不同的类别之间距离相等,避免了数值大小可能带来的误解。不过,独热编码也有缺点,尤其是当类别数量非常多时,会导致数据维度急剧增加,这种现象称为维度灾难。因此,在实际应用中,可能需要配合其他技术,如降维,或选择其他类型的编码方式,如标签编码或嵌入编码。

手动实现one-hot编码

普通实现

import torch
import torch.nn.functional as F

# 示例中文文本
texts = ['你好,最近怎么样?', '我过得很好,谢谢!', 'K同学啊']

# 构建词汇表
word_index = {}
index_word = {}
for i, word in enumerate(set("".join(texts))):
    word_index[word] = i
    index_word[i] = word

# 将文本转化为整数序列
sequences = [[word_index[word] for word in text] for text in texts]

# 获取词汇表大小
vocab_size = len(word_index)

# 将整数序列转化为one-hot编码
one_hot_results = torch.zeros(len(texts), vocab_size)
for i, seq in enumerate(sequences):
    one_hot_results[i, seq] = 1

# 准备打印结果
results = {
    "词汇表": word_index,
    "文本": texts,
    "文本序列": sequences,
    "One-Hot编码": one_hot_results
}

print(results)
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

NLP one-hot编码_第1张图片

使用jieba对中文文本进行分词处理

import jieba
import torch

# 示例中文文本
texts = ['你好,最近怎么样?', '我过得很好,谢谢!', 'K同学啊']

# 使用jieba进行分词
texts_seg = [" ".join(jieba.cut(text)) for text in texts]

# 构建词汇表
word_index = {}
index_word = {}
for text in texts_seg:
    for word in text.split():
        if word not in word_index:
            index = len(word_index)
            word_index[word] = index
            index_word[index] = word

# 将分词后的文本转化为整数序列
sequences = [[word_index[word] for word in text.split()] for text in texts_seg]

# 获取词汇表大小
vocab_size = len(word_index)

# 将整数序列转化为one-hot编码
one_hot_results = torch.zeros(len(texts), vocab_size)
for i, seq in enumerate(sequences):
    one_hot_results[i, seq] = 1

# 打印结果
print("词汇表:")
print(word_index)
print("\n分词后文本:")
print(texts_seg)
print("\n文本序列:")
print(sequences)
print("\nOne-Hot编码:")
print(one_hot_results)
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

NLP one-hot编码_第2张图片

使用jieba进行分词与不使用的区别在于处理的文本单元的粒度。中文文本不像英文,单词之间没有明显的空格分隔,因此需要特殊的处理来识别文本中的单词(词语)边界。

不使用jieba分词:

  • 文本处理通常是基于字符的,每个字符被视为独立的单元。
  • 这意味着构建的词汇表包含文本中的每一个独立字符。
  • one-hot编码的维度等于文本中不同字符的数量。
  • 对于模型而言,无法识别出更复杂的语义单元(如词组、成语等)。

使用jieba分词:

  • jieba会将文本中的句子分割成词语,这些词语通常包含更丰富的语义信息。
  • 构建的词汇表是基于词语的,而不是单个字符。
  • one-hot编码的维度等于文本中不同词语的数量,这通常会比字符的数量少,从而减少了模型的复杂度。
  • 对于模型而言,可以更好地处理和理解文本中的语义信息。

你可能感兴趣的:(自然语言处理,人工智能)