🚀 MacBERT中文スペル訂正(macbert4csc)モデル
macbert4cscは、中文のスペル訂正に特化したモデルです。中文テキストの訂正シーンで優れた性能を発揮し、テキストの正確性と品質を効果的に向上させます。
macbert4csc-base-chinese
のSIGHAN2015テストデータでの評価結果は以下の通りです。
|
訂正精度 |
訂正再現率 |
訂正F1値 |
文字レベル |
93.72 |
86.40 |
89.91 |
文レベル |
82.64 |
73.66 |
77.89 |
訓練に使用したデータはSIGHAN2015の訓練セット(論文再現)を用いているため、このモデルはSIGHAN2015のテストセットでSOTAレベルに達しています。
モデル構造はsoftmaskedbertを参考に改良されており、具体的な構造は以下の通りです。

🚀 クイックスタート
このプロジェクトは中文テキスト訂正プロジェクト pycorrector でオープンソース化されており、macbert4cscモデルをサポートしています。以下の方法で呼び出すことができます。
💻 使用例
基本的な使用法
pycorrector
ライブラリを使用してモデルを呼び出す例です。
from pycorrector.macbert.macbert_corrector import MacBertCorrector
m = MacBertCorrector("shibing624/macbert4csc-base-chinese")
i = m.correct('今天新情很好')
print(i)
高度な使用法
transformers
ライブラリを使用してモデルを呼び出す例です。
import operator
import torch
from transformers import BertTokenizer, BertForMaskedLM
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tokenizer = BertTokenizer.from_pretrained("shibing624/macbert4csc-base-chinese")
model = BertForMaskedLM.from_pretrained("shibing624/macbert4csc-base-chinese")
model.to(device)
texts = ["今天新情很好", "你找到你最喜欢的工作,我也很高心。"]
with torch.no_grad():
outputs = model(**tokenizer(texts, padding=True, return_tensors='pt').to(device))
def get_errors(corrected_text, origin_text):
sub_details = []
for i, ori_char in enumerate(origin_text):
if ori_char in [' ', '“', '”', '‘', '’', '琊', '\n', '…', '—', '擤']:
corrected_text = corrected_text[:i] + ori_char + corrected_text[i:]
continue
if i >= len(corrected_text):
continue
if ori_char != corrected_text[i]:
if ori_char.lower() == corrected_text[i]:
corrected_text = corrected_text[:i] + ori_char + corrected_text[i + 1:]
continue
sub_details.append((ori_char, corrected_text[i], i, i + 1))
sub_details = sorted(sub_details, key=operator.itemgetter(2))
return corrected_text, sub_details
result = []
for ids, text in zip(outputs.logits, texts):
_text = tokenizer.decode(torch.argmax(ids, dim=-1), skip_special_tokens=True).replace(' ', '')
corrected_text = _text[:len(text)]
corrected_text, details = get_errors(corrected_text, text)
print(text, ' => ', corrected_text, details)
result.append((corrected_text, details))
print(result)
出力結果は以下の通りです。
今天新情很好 => 今天心情很好 [('新', '心', 2, 3)]
你找到你最喜欢的工作,我也很高心。 => 你找到你最喜欢的工作,我也很高兴。 [('心', '兴', 15, 16)]
モデルファイルの構成
macbert4csc-base-chinese
├── config.json
├── added_tokens.json
├── pytorch_model.bin
├── special_tokens_map.json
├── tokenizer_config.json
└── vocab.txt
📚 ドキュメント
訓練データセット
SIGHAN+Wang271K中文訂正データセット
SIGHAN+Wang271K中文訂正データセットのデータ形式は以下の通りです。
[
{
"id": "B2-4029-3",
"original_text": "晚间会听到嗓音,白天的时候大家都不会太在意,但是在睡觉的时候这嗓音成为大家的恶梦。",
"wrong_ids": [
5,
31
],
"correct_text": "晚间会听到噪音,白天的时候大家都不会太在意,但是在睡觉的时候这噪音成为大家的恶梦。"
}
]
モデルファイルの構造は以下の通りです。
macbert4csc
├── config.json
├── pytorch_model.bin
├── special_tokens_map.json
├── tokenizer_config.json
└── vocab.txt
macbert4cscを訓練する場合は、https://github.com/shibing624/pycorrector/tree/master/pycorrector/macbert を参照してください。
MacBERTについて
MacBERT は改良されたBERTモデルで、新しいMLMを訂正として利用する事前学習タスクを採用しており、事前学習と微調整の間のギャップを緩和しています。
以下は事前学習タスクの例です。
タスク |
例 |
オリジナルの文 |
we use a language model to predict the probability of the next word. |
MLM |
we use a language [M] to [M] ##di ##ct the pro [M] ##bility of the next word . |
全単語マスキング |
we use a language [M] to [M] [M] [M] the [M] [M] [M] of the next word . |
N-gramマスキング |
we use a [M] [M] to [M] [M] [M] the [M] [M] [M] [M] [M] next word . |
MLMを訂正として利用 |
we use a text system to ca ##lc ##ulate the po ##si ##bility of the next word . |
新しい事前学習タスクに加え、このモデルは以下の技術も採用しています。
- 全単語マスキング(Whole Word Masking,WWM)
- N-gramマスキング
- 文順予測(Sentence-Order Prediction,SOP)
主なニューラルネットワークアーキテクチャに差異がないため、当社のMacBERTはオリジナルのBERTを直接置き換えることができます。
詳細な技術情報については、論文 Revisiting Pre-trained Models for Chinese Natural Language Processing を参照してください。
📄 ライセンス
このプロジェクトはApache-2.0ライセンスを採用しています。
📚 引用
@software{pycorrector,
author = {Xu Ming},
title = {pycorrector: Text Error Correction Tool},
year = {2021},
url = {https://github.com/shibing624/pycorrector},
}