Conll2012 中文分词和词性标注
LSTM chinese position of sentence tagging
采用 chinese-bert-wwm-ext 的分词,
在 conll-2012, chinese, v4 数据集上训练.
在第 54 个 epoch 时达到最高分数,
training_accuracy=0.8970,
validation_accuracy=0.8687.
第 0 个 epoch 时, training_accuracy=0.8676, validation_accuracy=0.8483.
之后的训练, 每个 epoch 提升非常小.
设置的 patience=5, 但是我看 AllenNLP 官方示例中的 patience=25, 因此, 如果设置 patience=25, 准确率还可以再提高.
https://demo.allennlp.org/named-entity-recognition/named-entity-recognition
此模型可能的用途.
(1) 迁移学习, 做完分词和词性标注之后, 可用于实体识别, 句子关键词识别的迁移学习.
依赖
模型训练和预测依赖于 AllenNLP 框架.
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple allennlp==2.4.0
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple allennlp-models==2.4.0
模型训练
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os
import sys
from allennlp.commands.train import train_model_from_file
from allennlp_models.tagging.models.crf_tagger import CrfTagger
from project_settings import project_path
model_path = os.path.join(project_path, 'model/pos_tagging/config.json')
sys.path.append(os.path.dirname(model_path))
from smart.allennlp_models.tagging.dataset_readers.bio_tagging_json_reader import BioTaggingJsonReader
from smart.allennlp.training.optimizers import BertAdamOptimizer
train_model_from_file(
parameter_filename=model_path,
serialization_dir="serialization_dir",
)
模型预测
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os
import sys
import time
from allennlp.commands.train import train_model_from_file
from allennlp.data.tokenizers.pretrained_transformer_tokenizer import PretrainedTransformerTokenizer
from allennlp.models.archival import archive_model, load_archive
from allennlp.predictors.predictor import Predictor
from allennlp_models.tagging.models.crf_tagger import CrfTagger
from project_settings import project_path
model_path = os.path.join(project_path, 'model/pos_tagging/')
sys.path.append(os.path.dirname(model_path))
from smart.allennlp_models.tagging.dataset_readers.bio_tagging_json_reader import BioTaggingJsonReader
from smart.allennlp.training.optimizers import BertAdamOptimizer
from smart.allennlp_models.tagging.predictors.sentence_tagger_with_tokenizer import SentenceTaggerWithTokenizerPredictor
model_name = r'D:\Users\tianx\PycharmProjects\PyTorch\pretrained\chinese-bert-wwm-ext'
tokenizer = PretrainedTransformerTokenizer(
model_name=model_name
)
archive = load_archive(model_path)
predictor: SentenceTaggerWithTokenizerPredictor = Predictor.from_archive(archive, predictor_name='sentence_tagger_with_tokenizer', extra_args={'tokenizer': tokenizer})
text = '梵蒂冈本应认真的、负责任的检讨历史上有负于中国人民的错误行为,向中国人民道歉。'
json_dict = {'sentence': text}
begin = time.time()
outputs = predictor.predict_json(json_dict)
cost = time.time() - begin
print(cost)
tags = outputs['tags']
print(tags)
predicted_spans = predictor.bio_decode(outputs)
print(predicted_spans)
以上代码输出结果为:
0.013086795806884766
['O', 'B-NR', 'I-NR', 'I-NR', 'B-AD', 'B-VV', 'B-VV', 'I-VV', 'B-DEC', 'B-PU', 'B-VV', 'I-VV', 'I-VV', 'B-DEC', 'B-NN', 'I-NN', 'B-NN', 'I-NN', 'B-LC', 'B-VE', 'B-VV', 'I-VV', 'B-NR', 'I-NR', 'B-NN', 'I-NN', 'B-DEG', 'B-NN', 'I-NN', 'B-NN', 'I-NN', 'B-PU', 'B-P', 'B-NR', 'I-NR', 'B-NN', 'I-NN', 'B-VV', 'I-VV', 'B-PU', 'O']
[('梵蒂冈', 'NR'), ('本', 'AD'), ('应', 'VV'), ('认真', 'VV'), ('的', 'DEC'), ('、', 'PU'), ('负责任', 'VV'), ('的', 'DEC'), ('检讨', 'NN'), ('历史', 'NN'), ('上', 'LC'), ('有', 'VE'), ('负于', 'VV'), ('中国', 'NR'), ('人民', 'NN'), ('的', 'DEG'), ('错误', 'NN'), ('行为', 'NN'), (',', 'PU'), ('向', 'P'), ('中国', 'NR'), ('人民', 'NN'), ('道歉', 'VV'), ('。', 'PU')]