【问题标题】:encode list of words at the character level在字符级别编码单词列表
【发布时间】:2021-10-31 01:30:15
【问题描述】:

我想实现一个接收单词列表并返回张量的函数

这个想法是为每个单词创建张量,其中每一行都用零和一个表示该位置的字母的单个填充。例如单词"abc" 将由以下张量表示:

tensor([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您可以使用字典映射和F.one_hot 的组合来实现此目的,F.one_hot 是执行密集到one-hot 转换的内置函数。

    1. 构造字典映射str到索引。我们将插入一个额外的字符"0",以便为短于最大长度的单词添加一些填充:

      >>> alphabet = dict(zip('0abcdefghijklmnopqrstuvwxyz', range(27)))
      
    2. 找到最大长度并填充较短的单词:

      >>> max_length = max(len(w) for w in words)
      
    3. 用适当数量的0 字符填充所有单词:

      >>> padded = [w + '0'*(max_length - len(w)) for w in words]
      ['cd0', 'abc']
      
    4. 现在通过遍历所有填充的单词和字符来构造张量:

      >>> dense = torch.tensor([[alphabet[c] for c in w] for w in padded])
      tensor([[3, 4, 0],
              [1, 2, 3]])
      

    最后申请torch.functional.one_hot

    >>> x = F.one_hot(dense, num_classes=27)
    tensor([[[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
    
            [[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]])
    

    一直以来,我们一直在使用包含 26 + 1 值的字典,其中额外的字符 "0" 用于对填充值进行一次性编码。我们现在可以删除对应"0"的第一列:

    >>> x[..., 1:]
    tensor([[[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
    
            [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2018-06-15
      相关资源
      最近更新 更多