A bidirectional recurrent neural network model with attention mechanism for restoring missing punctuation in unsegmented text
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 8 年前 | ||
| 10 年前 | ||
| 10 年前 | ||
| 4 年前 | ||
| 8 年前 | ||
| 6 年前 | ||
| 8 年前 | ||
| 8 年前 | ||
| 8 年前 | ||
| 8 年前 | ||
| 6 年前 | ||
| 8 年前 | ||
| 8 年前 |
标点插入器(Punctuator)
一种使用注意力机制的双向循环神经网络模型,用于恢复未分隔文本中缺失的词间标点符号。
该模型可以分为两个阶段训练(第二阶段可选):
- 第一阶段基于带标点注释的文本进行训练。在这里,模型仅根据文本特征学习如何恢复标点。
- 可选择的第二阶段则在带标点和暂停注释的文本上进行训练。此阶段模型学习结合暂停时长与文本特征,并适应目标领域。如果省略暂停,则仅执行适应性调整。对于自动语音识别系统的输出恢复标点,第二阶段使用暂停时长尤为适用。
效果如何?
请注意,以下所有得分均基于未分段的文本,我们没有使用韵律特征,因此除了要根据纯文本特征检测句子边界外,模型还需确定问号、句号或感叹号等边界类型。这些分数是在测试集上计算得到的。
在默认设置下,使用理想的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