文本表示方法--独热编码(One-Hot)

one-hot编码(每列只有一个1,其他都为0的一维矩阵)

一.图示

在这里插入图片描述

二.代码实现

import numpy as np

# 分词过的语料
corpus = [
    '这 是 第一个 文档',
    '这是 第二个 文档',
    '这是 最后 一个 文档',
    '现在 没有 文档 了'
]

## 1.手动实现
words = []
for corpu in corpus:
    words.extend(corpu.split())
words = list(set(words))

# 构建词表 编码
word_dict = {
    
    word: index for index, word in enumerate(words)}
print(word_dict)
vocab_size = len(word_dict)


def get_one_hot(index):
    """
    获得一个one_hot编码
    :param index:
    :return:
    """
    # 全零矩阵
    one_hot = [0 for _ in range(vocab_size)]
    # 指定位置1
    one_hot[index] = 1
    return np.array(one_hot)


# 原始句子
print(corpus[0])
# 转换成index
indexs = [word_dict[word] for word in corpus[0].split()]

# 转换成one_hot
one_hot_np = np.array([get_one_hot(index) for index in indexs])
print(one_hot_np)

## 2.Sklearn实现
from sklearn.preprocessing import LabelBinarizer

# 初始化编码器
lb = LabelBinarizer()
lb.fit_transform(words)
print(lb.classes_)
# 所有句子
sentence = corpus[0].split()
print(sentence)
one_hot_np2 = lb.transform(sentence)
print(one_hot_np2)
# 解码
print(lb.inverse_transform(one_hot_np2))

三.One-Hot缺点

1.词通常很多,比如50W,那就意味着需要句子长度x50000大小的矩阵才能表示这个句子
2.这种方法效率低下,矩阵包含很多零
3.无法表达相似性
4.新加一个词我们需要重新计算所有的词

参考: https://github.com/luojie1024

猜你喜欢

转载自blog.csdn.net/Cocktail_py/article/details/119845360