BertPunc(使用 BERT 恢复标点符号)

数据挖掘 nlp 伯特
2021-09-25 06:38:49

我找到了标点符号恢复的脚本我对这种方法有一个疑问。

我将简要解释一下作者的逻辑。为每个单词分配四个标记之一:Other (0)、PERIOD (1)、COMMA (2)、QUESTION (3)。此外,所有单词都转换为 BERT 令牌。这是一个例子:

  2045  0
  2003  0
  2200  0
  2210  0
  3983  0
  2301  0
  2974  0
  1999  0
  2068  2

接下来,我们进行填充。我们设置一个段(例如八个单词),对于每个单词,我们在一个标记之前取两个单词,在一个标记之后取四个单词。此外,我们在每个单词之后添加一个填充标记。对于第一个单词,之前没有单词。因此,从最后取一个词。同样,对于最后一个单词,后面没有单词,因此从开头取一个单词。这是一个例子。

[1999, 2068, 2045, 0, 2003, 2200, 2210, 3983] 0
[2068, 2045, 2003, 0, 2200, 2210, 3983, 2301] 0
[2045, 2003, 2200, 0, 2210, 3983, 2301, 2974] 0
[2003, 2200, 2210, 0, 3983, 2301, 2974, 1999] 0
[2200, 2210, 3983, 0, 2301, 2974, 1999, 2068] 0
[2210, 3983, 2301, 0, 2974, 1999, 2068, 2045] 0
[3983, 2301, 2974, 0, 1999, 2068, 2045, 2003] 0
[2301, 2974, 1999, 0, 2068, 2045, 2003, 2200] 0
[2974, 1999, 2068, 0, 2045, 2003, 2200, 2210] 2

第一列包含标记,第二列包含标点符号。在第一列中,“0”对应于填充。接下来我们做 TensorDataset,然后是 DataLoader。在第二列中,“0”对应“其他”,“2”对应“句号”。最后我们训练一个模型:

for inputs, labels in data_loader_train:
       inputs, labels = inputs.cuda(), labels.cuda()
       output = model(inputs)

该算法运行良好,但我不明白以下内容。将填充物放在中间有什么意义?也许我们可以用更简单的方式用 BERT 进行标点还原?

1个回答

我也对 BertPunc 的方法感到困惑。事实上,我不敢相信它真的有效。因为该方法使用 BertLanguageModel 来完成这项工作,而 LanguseModel 的主要功能是预测一个单词的下一个单词。所以也用你的例子,BertPunc 输入 8 个字,bert 的输出应该是输入的 8 个下一个字。但是 BertPunc 添加了一个 Linear 层,只能得到 1 个输出值,即预测标点符号。

但我认为我们应该像下图那样使用bert:在此处输入图像描述