punctuator2:基于双向循环神经网络与注意力机制的文本标点恢复工具

A bidirectional recurrent neural network model with attention mechanism for restoring missing punctuation in unsegmented text

分支1Tags1
文件最后提交记录最后更新时间
8 年前
10 年前
10 年前
4 年前
8 年前
6 年前
8 年前
8 年前
8 年前
8 年前
6 年前
8 年前
8 年前

标点插入器(Punctuator)

一种使用注意力机制的双向循环神经网络模型,用于恢复未分隔文本中缺失的词间标点符号。

该模型可以分为两个阶段训练(第二阶段可选):

  1. 第一阶段基于带标点注释的文本进行训练。在这里,模型仅根据文本特征学习如何恢复标点。
  2. 可选择的第二阶段则在带标点和暂停注释的文本上进行训练。此阶段模型学习结合暂停时长与文本特征,并适应目标领域。如果省略暂停,则仅执行适应性调整。对于自动语音识别系统的输出恢复标点,第二阶段使用暂停时长尤为适用。

效果如何?

  • 功能演示可在此查看:DEMO
  • 您可以尝试与此模型竞争:DEMO2

请注意,以下所有得分均基于未分段的文本,我们没有使用韵律特征,因此除了要根据纯文本特征检测句子边界外,模型还需确定问号、句号或感叹号等边界类型。这些分数是在测试集上计算得到的。

在默认设置下,使用理想的Theano安装及现代GPU,训练速度约为每秒10000个单词。

预训练模型可以从这里下载(包含Demo及来自Interspeech论文的2个模型)。

英语TED演讲数据集

训练集大小:210万字。仅第一阶段。更多详情见这篇论文。 相比之下,我们的前一个模型总体F1得分为50.8。

标点符号 精确率 召回率 F-分数
,逗号 64.4 45.2 53.1
?问号 67.5 58.7 62.8
.句号 72.3 71.5 71.9
总体 68.9 58.1 63.1

英语Europarl v7数据集

训练集大小:4000万字。仅第一阶段。细节见./example

您还可以尝试在此与该模型竞争

标点符号 精确率 召回率 F-分数
?问号 77.7 73.2 75.4
!感叹号 50.0 0.1 0.1
,逗号 68.9 72.0 70.4
-破折号 55.9 8.8 15.2
:冒号 60.9 23.8 34.2
;分号 44.7 1.1 2.2
.句号 84.7 84.1 84.4
总体 75.7 73.9 74.8

必需条件

  • Python 2.7
  • Numpy
  • Theano

数据要求

  • 首阶段模型训练和验证所需的清洁文本文件。每个标点符号前后都需有空格。 示例: to be ,COMMA or not to be ,COMMA that is the question .PERIOD
  • (可选)第二阶段模型训练和验证的暂停标注文本文件。应与首阶段数据同样清理。词后的暂停时长(以秒计)用特殊标签<sil=0.200>标记。如有标点符号,也应在暂停标签之后。 示例: to <sil=0.000> be <sil=0.100> ,COMMA or <sil=0.000> not <sil=0.000> to <sil=0.000> be <sil=0.150> ,COMMA that <sil=0.000> is <sil=0.000> the <sil=0.000> question <sil=1.000> .PERIOD 第二阶段数据也可不包含暂停注释,仅用于目标领域的适配。

确保句子首字母不要大写,以免给模型关于句号位置的不公平提示。同时,用于训练和验证的文本文件必须足够大(至少为minibatch_size x sequence_length的单词数,默认设置为128x50=6400单词),否则可能会出错。

配置

可在data.py的头部配置词汇量、标点符号及其映射,以及转换后的数据位置。main.py和main2.py的标题部分可配置一些模型超参数。学习率和隐藏层大小可通过参数传递。

使用

第一步是数据转换。假设已处理并清理好的*.train.txt、.dev.txt和.test.txt文件位于<data_dir>,转换可以通过运行命令启动:

python data.py <data_dir>

如果有第二阶段的数据,则:

python data.py <data_dir> <second_stage_data_dir>

第一阶段训练可以用命令执行:

python main.py <model_name> <hidden_layer_size> <learning_rate>

例如,python main.py <model_name> 256 0.02效果良好。

第二阶段训练命令为:

python main2.py <model_name> <hidden_layer_size> <learning_rate> <first_stage_model_path>

预处理过的文本可以通过如下方式加上标点:

cat data.dev.txt | python punctuator.py <model_path> <model_output_path>

如果data.dev.txt中包含暂停注释,并且您有一个针对带有暂停注释数据训练的第二阶段模型,则:

cat data.dev.txt | python punctuator.py <model_path> <model_output_path> 1

data.dev.txt中的标点符号无需移除,punctuator.py脚本会忽略它们。

本例中的错误统计可以通过以下命令计算:

python error_calculator.py data.dev.txt <model_output_path>

您可以使用以下命令玩转经过训练的模型(假定输入文本与训练数据类似地进行了预处理):

python play_with_model.py <model_path>

或者,如果您想看到模型认为哪些词是未知词(OOVs),则使用:

python play_with_model.py <model_path> 1

引用文献

该软件描述于文献:

@inproceedings{tilk2016,
      author    = {Ottokar Tilk and Tanel Alum\"ae},
      title     = {Bidirectional Recurrent Neural Network with Attention Mechanism for Punctuation Restoration},
      booktitle = {Interspeech 2016},
      year      = {2016}
    }

文中使用的版本是发布v1.0

替代方案

  • TensorFlow重新实现的Punctuator:链接
  • 使用额外韵律特征的这个仓库分支:punkProse
  • 准确度稍低但速度快得多(约50倍)的卷积神经网络:keras-punctuator(详细信息见:讨论
  • 一个通用的序列标注模型:sequence-labeler,稍作修改后可用于标点恢复;Punctuator2也可能适用于其他序列标注问题。
  • 我们之前采用单向LSTM的方法(准确性较低,但如果不想使用Theano,这个很适合):punctuator

项目介绍

A bidirectional recurrent neural network model with attention mechanism for restoring missing punctuation in unsegmented text

定制我的领域