pycorrector: Инструмент для коррекции китайского текста. Поддерживает китайское фонетическое сходство, схожую форму и исправление грамматических ошибок, разработанное с помощью Python3. Внедрено исправление текстовых ошибок для моделей Kenlm, ConvSeq2Seq, BERT, MacBERT, ELECTRA, ERNIE, Transformer и других, а также оценено влияние каждой модели на набор данных SigHAN.
Конечно, для различных бизнес-сценариев эти проблемы могут не существовать. Например, метод ввода пиньинь и корректура распознавания речи фокусируются на ошибках, похожих на звуки, а метод ввода Wubi, а корректура OCR фокусируется на ошибках, похожих на форму.
Исправление ошибок запросов поисковых систем фокусируется на всех типах ошибок.
Этот проект направлен на решение «звукоподобных, фонетических, грамматических ошибок, ошибок в именах собственных» и других типов.
Местоположение опечатки определяется на основе языковой модели, а опечатка исправляется с помощью функции фонетического сходства пиньинь, функции расстояния редактирования штрихов и функции недоумения языковой модели.
PS:
Official Demo: https://www.mulanai.com/product/corrector/
HuggingFace Demo: https://huggingface.co/spaces/shibing624/pycorrector
run example: examples/gradio_demo.py to see the demo:
python examples/gradio_demo.py
Предоставьте примеры сценариев оценки/evaluate_models.py:
Графический процессор: Tesla V100, видеопамять 32 ГБ
Model Name | Model Hub Link | Backbone | GPU | Precision | Recall | F1 | QPS |
---|---|---|---|---|---|---|---|
Rule | kenlm | CPU | 0.6860 | 0.1529 | 0.2500 | 9 | |
BERT-CSC | bert-base-chinese | GPU | 0.8029 | 0.4052 | 0.5386 | 2 | |
BART-CSC | fnlp/bart-base-chinese | GPU | 0.6984 | 0.6354 | 0.6654 | 58 | |
T5-CSC | byt5-small | GPU | 0.5220 | 0.3941 | 0.4491 | 111 | |
Mengzi-T5-CSC | mengzi-t5-base | GPU | 0.8321 | 0.6390 | 0.7229 | 214 | |
ConvSeq2Seq-CSC | ConvSeq2Seq | GPU | 0.2415 | 0.1436 | 0.1801 | 6 | |
ChatGLM-6B-CSC | ChatGLM | GPU | 0.5263 | 0.4052 | 0.4579 | 4 | |
MacBERT-CSC | hfl/chinese-macbert-base | GPU | 0.8254 | 0.7311 | 0.7754 | 224 |
SIGHAN 2015
подойти ближеSOTAиз Эффектpip install -U pycorrector
or
pip install -r requirements.txt
git clone https://github.com/shibing624/pycorrector.git
cd pycorrector
pip install --no-deps .
Вы можете завершить установку любым из двух вышеуказанных способов. Если вы не хотите устанавливать зависимые пакеты, вы можете напрямую использовать Docker, чтобы получить установленную среду развертывания.
docker run -it -v ~/.pycorrector:/root/.pycorrector shibing624/pycorrector:0.0.2
Вы можете использовать его, вызвав python позже. В образе уже установлены kenlm, pycorrector и другие пакеты. Подробности см. в Dockerfile.
Пример использования:
pip install kenlm
pip install -r requirements.txt
example: examples/base_demo.py
import pycorrector
corrected_sent, detail = pycorrector.correct('Юные пионеры должны уступить места пожилым')
print(corrected_sent, detail)
output:
Юные пионеры должны уступить места старикам [('из-за', 'должен', 4, 6), ('сидеть', 'сиденье', 10, 11)]
По умолчанию метод правила начинается с пути
~/.pycorrector/datasets/zh_giga.no_cna_cmn.prune01244.klm
нагрузкаkenlmязык Модельдокумент,Если в обнаружении нет файла, 则程序会自动联网下载。Конечно, вы также можете загрузить его вручную.Файл модели (2,8 ГБ)и поместите его в это место。
example: examples/detect_demo.py
import pycorrector
idx_errors = pycorrector.detect('Юные пионеры должны уступить места старикам')
print(idx_errors)
output:
[['из-за', 4, 6, 'word'], ['сидеть', 10, 11, 'char']]
返回类型да
list
,[error_word, begin_pos, end_pos, error_type]
,pos
Индексная позиция начинается с0начинать。
example: examples/proper_correct_demo.py
import sys
sys.path.append("..")
from pycorrector.proper_corrector import ProperCorrector
m = ProperCorrector()
x = [
«Расплата скоро придет»,
«Я купил сегодня яблоки на Pinduoduo»,
]
for i in x:
print(i, ' -> ', m.proper_correct(i))
output:
Возмездие приближается -> («Наступает возмездие», [('Получить последнюю версию', «Приходите друг за другом», 2, 6)])
Я купил сегодня яблоки на Pinduoduo. -> («Я купил сегодня яблоки на Pinduoduo», [('пиндуодуо', 'Пиндуодуо', 3, 6)])
Загружая собственный набор ошибок, пользователи могут исправить известные ошибки, включая две функции: 1) [Повышение точности] для добавления ложных срабатываний и отбеливания 2) [Улучшение скорости отзыва] для дополнения отзыва;
example: examples/use_custom_confusion.py
import pycorrector
error_sentences = [
«Сколько стоит купить iPhoneX»,
«Совместные контролеры Сяо Хуа, Хо Жунцюань и Чжан Цикан»,
]
for line in error_sentences:
print(pycorrector.correct(line))
print('*' * 42)
pycorrector.set_custom_confusion_path_or_dict('./my_custom_confusion.txt')
for line in error_sentences:
print(pycorrector.correct(line))
output:
(«Сколько стоит купить iPhoneX», []) # "iphonex" пропущен, должно быть "iphoneX"
(«Совместные контролеры Сяо Хуа, Хо Жунцюань и Чжан Цикан», [['Чжан Цикан', «Чжан Цикан», 14, 17]]) # «Чжан Цикан» убит по ошибке, его не нужно исправлять.
*****************************************************
(«Сколько стоит купить iPhoneX», [['iphonex', 'iphoneX', 1, 8]])
(«Совместные контролеры Сяо Хуа, Хо Жунцюань и Чжан Цикан», [])
в
./my_custom_confusion.txt
из Формат контента следующий,Разделяются пробелами:
айфон плохой iPhoneX
Чжан Цикан Чжан Цикан
Функция установки путаницы находится в
correct
Действителен в методе;set_custom_confusion_dict
методизpath
Параметры пользовательские Пользовательский набор путь к файлу путаницы (str) или словарь набора путаницы (dict).
Доступно для загрузки и использования по умолчаниюизkenlmязык Модельzh_giga.no_cna_cmn.prune01244.klm
документда2.8G,Маленькая памятьизиспользование компьютераpycorrector
Процедура может быть сложной。
Помогите пользователям загрузить собственную языковую модель тренироватьсяизkenlm.,Или используйте модель тренирования данных People’s Daily за 2014 год.,Маленькая модель (140М),чуть более низкая точность,Модель Скачать адрес:люди2014corpus_chars.klm (пароль o5e9)。
example:examples/load_custom_language_model.py
from pycorrector import Corrector
import os
pwd_path = os.path.abspath(os.path.dirname(__file__))
lm_path = os.path.join(pwd_path, './people2014corpus_chars.klm')
model = Corrector(language_model_path=lm_path)
corrected_sent, detail = model.correct('Юные пионеры должны уступить места старикам')
print(corrected_sent, detail)
output:
Юные пионеры должны уступить места старикам [('из-за', 'должен', 4, 6), ('сидеть', 'сиденье', 10, 11)]
Поддерживает исправление орфографических ошибок на уровне английского слова.
example:examples/en_correct_demo.py
import pycorrector
sent = "what happending? how to speling it, can you gorrect it?"
corrected_text, details = pycorrector.en_correct(sent)
print(sent, '=>', corrected_text)
print(details)
output:
what happending? how to speling it, can you gorrect it?
=> what happening? how to spelling it, can you correct it?
[('happending', 'happening', 5, 15), ('speling', 'spelling', 24, 31), ('gorrect', 'correct', 44, 51)]
Поддерживает преобразование из традиционного китайского в упрощенный китайский, а также преобразование из упрощенного китайского в традиционный китайский.
example:examples/traditional_simplified_chinese_demo.py
import pycorrector
traditional_sentence = «Меланхолия из Тайваньской черепахи»
simplified_sentence = pycorrector.traditional2simplified(traditional_sentence)
print(traditional_sentence, '=>', simplified_sentence)
simplified_sentence = «Меланхолия из Тайваньской черепахи»
traditional_sentence = pycorrector.simplified2traditional(simplified_sentence)
print(simplified_sentence, '=>', traditional_sentence)
output:
Меланхолия из Тайваня черепаха => Меланхолия из Тайваня черепаха
Меланхолия из Тайваня черепаха => Меланхолия из Тайваня черепаха
Поддержка пакетного исправления текстовых ошибок
python -m pycorrector -h
usage: __main__.py [-h] -o OUTPUT [-n] [-d] input
@description:
positional arguments:
input the input file path, file encode need utf-8.
optional arguments:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
the output file path.
-n, --no_char disable char detect mode.
-d, --detail print detail info
case:
python -m pycorrector input.txt -o out.txt -n -d
输入документ:
input.txt
;输出документ:out.txt
;Отключить исправление ошибок детализации слов;Распечатать подробную информацию об исправлении ошибок;Результат исправления ошибок\t
интервал
Одна из первоначальных целей этого проекта — сравнить и поделиться различными методами исправления текстовых ошибок и вдохновить других. Для меня было бы большой честью, если бы это могло вдохновить всех на задачу исправления текстовых ошибок.
В основном использовались различные глубокие модели, применяемые для исправления. ошибок в тексте Задача,分别да前面Модель
Введение в разделизmacbert、seq2seq、
bert、electra、transformer
、ernie-csc、T5,каждый Модельметод内置于pycorrector
документ夹下,иметьREADME.md
Подробное руководство,Каждую модель можно запускать независимо,Нет зависимости друг от друга.
pip install -r requirements-dev.txt
Каждая модель может независимо предварительно обрабатывать данные, обучаться и прогнозировать.
Модель исправления орфографии на китайском языке, основанная на MacBERT, которая меняет структуру сети. Исходный код модели выложен на HuggingFace. Models:https://huggingface.co/shibing624/macbert4csc-base-chinese
Модельная структура сети:
Подробные руководства см. в pycorrector/macbert/README.md.
example:examples/macbert_demo.py
import sys
sys.path.append("..")
from pycorrector.macbert.macbert_corrector import MacBertCorrector
if __name__ == '__main__':
error_sentences = [
— Извините, что беспокою вас. Надеюсь, ты будешь хорошо танцевать,
«Юные пионеры должны уступить места старикам»,
«Машинное обучение — лучшее выражение интеллекта и знаний в области искусственного интеллекта»,
«Небольшая рыбная лодка плывет по реке Пинцзин»,
«Мой родной город — край яркой рыбы и риса»,
]
m = MacBertCorrector("shibing624/macbert4csc-base-chinese")
for line in error_sentences:
correct_sent, err = m.macbert_correct(line)
print("query:{} => {}, err:{}".format(line, correct_sent, err))
output:
запрос: Мне очень жаль, что я вас побеспокоил. надеюсь, ты будешь хорошо танцевать => Мне очень жаль, что я беспокою вас. Надеюсь, ты хорошо проведешь время, танцуя, ошибка:[('Нет', 'танец', 14, 15)]
запрос:Пионеры должны уступить места старикам => Юные пионеры должны уступить места старикам, ошибка:[('потому что', 'отвечать', 4, 5)]
Вопрос: Машинное обучение является наиболее разумным выражением интеллекта в области искусственного интеллекта. => Машинное обучение — это область искусственного интеллекта, которая лучше всего воплощает интеллект. ошибка:[('семь', 'посуда', 1, 2), ('сталкиваться', 'домен', 10, 11)]
запрос:Небольшая лодка с рыбой плывет по реке Пинцзин. => Маленькая рыбацкая лодка плывет по реке Пинцзин. err:[]
вопрос:Мой родной город — край рыбы и риса => Мой родной город известен как край рыбы и риса. ошибка:[('яркий', 'имя', 6, 7)]
import operator
import torch
from transformers import BertTokenizerFast, BertForMaskedLM
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tokenizer = BertTokenizerFast.from_pretrained("shibing624/macbert4csc-base-chinese")
model = BertForMaskedLM.from_pretrained("shibing624/macbert4csc-base-chinese")
model.to(device)
texts = ["Новая ситуация сегодня очень хорошая", «Я очень рада, что ты нашел свою любимую работу».]
text_tokens = tokenizer(texts, padding=True, return_tensors='pt').to(device)
with torch.no_grad():
outputs = model(**text_tokens)
def get_errors(corrected_text, origin_text):
sub_details = []
for i, ori_char in enumerate(origin_text):
if ori_char in [' ', '“', '”', '‘', '’', '\n', '…', '—', 'Дуть']:
# add unk word
corrected_text = corrected_text[:i] + ori_char + corrected_text[i:]
continue
if i >= len(corrected_text):
break
if ori_char != corrected_text[i]:
if ori_char.lower() == corrected_text[i]:
# pass english upper char
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, (i, text) in zip(outputs.logits, enumerate(texts)):
_text = tokenizer.decode((torch.argmax(ids, dim=-1) * text_tokens.attention_mask[i]),
skip_special_tokens=True).replace(' ', '')
corrected_text, details = get_errors(_text, text)
print(text, ' => ', corrected_text, details)
result.append((corrected_text, details))
print(result)
output:
Сегодняшняя новая любовь очень хороша => У меня сегодня хорошее настроение [('новый', 'Сердце', 2, 3)]
Я также очень рада, что вы нашли свою любимую работу. => Я также рада, что вы нашли свою любимую работу. [('Сердце', 'процветать', 15, 16)]
Файл модели:
macbert4csc-base-chinese
├── config.json
├── added_tokens.json
├── pytorch_model.bin
├── special_tokens_map.json
├── tokenizer_config.json
└── vocab.txt
на основеERNIEизисправление китайской орфографии Модель,Модель Уже открытый исходный код вPaddleNLPиз
Модельбиблиотекаhttps://bj.bcebos.com/paddlenlp/taskflow/text_correction/csc-ernie-1.0/csc-ernie-1.0.pdparams。
Модельная структура сети:
Подробные руководства см. в pycorrector/ernie_csc/README.md.
example:examples/ernie_csc_demo.py
from pycorrector.ernie_csc.ernie_csc_corrector import ErnieCSCCorrector
if __name__ == '__main__':
error_sentences = [
— Извините, что беспокою вас. Надеюсь, ты будешь хорошо танцевать,
«Юные пионеры должны уступить места старикам»,
«Машинное обучение — лучшее выражение интеллекта и знаний в области искусственного интеллекта»,
«Небольшая рыбная лодка плывет по реке Пинцзин»,
«Мой родной город — край яркой рыбы и риса»,
]
corrector = ErnieCSCCorrector("csc-ernie-1.0")
for line in error_sentences:
result = corrector.ernie_csc_correct(line)[0]
print("query:{} => {}, err:{}".format(line, result['target'], result['errors']))
output:
запрос: Мне очень жаль, что я вас побеспокоил. надеюсь, ты будешь хорошо танцевать => Мне очень жаль, что я беспокою вас. Надеюсь, ты хорошо проведешь время, танцуя, err:[{'position': 14, 'correction': {'никто': 'танец'}}]
запрос:Пионеры должны уступить места старикам => Юные пионеры должны уступить места старикам, err:[{'position': 4, 'correction': {'потому что': 'отвечать'}}, {'position': 10, 'correction': {'сидеть': 'сиденье'}}]
Вопрос: Машинное обучение является наиболее разумным выражением интеллекта в области искусственного интеллекта. => Машинное обучение — это область искусственного интеллекта, которая лучше всего воплощает интеллект. err:[{'position': 1, 'correction': {'Семь': 'Инструмент'}}, {'position': 10, 'correction': {'сталкиваться': 'домен'}}]
запрос:Небольшая лодка с рыбой плывет по реке Пинцзин. => Маленькая рыбацкая лодка плывет по реке Пинцзин. err:[]
вопрос:Мой родной город — край рыбы и риса => Мой родной город известен как край рыбы и риса. err:[{'position': 6, 'correction': {'яркий':'имя'}}]
Вы можете использовать инструмент Taskflow, предоставляемый PaddleNLP, для исправления ошибок во входном тексте одним щелчком мыши. Конкретное использование заключается в следующем:
from paddlenlp import Taskflow
text_correction = Taskflow("text_correction")
text_correction('Когда мы сталкиваемся с невзгодами, мы должны иметь смелость противостоять им, и мы должны становиться более мужественными с каждой неудачей, чтобы мы могли двигаться вперед по пути к успеху.')
text_correction('人生就да如此,Только благодаря тренировкам можно стать сильнее,Чтобы стать более оптимистичным. ')
output:
[{'source': «Когда мы сталкиваемся с невзгодами, мы должны смело противостоять им и становиться более мужественными с каждой неудачей, чтобы мы могли двигаться вперед по пути к успеху. ',
'target': «Когда мы сталкиваемся с невзгодами, мы должны смело противостоять им и становиться более мужественными с каждой неудачей, чтобы мы могли двигаться вперед по пути к успеху. ',
'errors': [{'position': 3, 'correction': {'на самом деле': 'территория'}}]}]
[{'source': «Жизнь такова. Только закалившись, можно стать сильнее и оптимистичнее. ',
'target': «Жизнь такова. Только закалившись, можно стать сильнее и оптимистичнее. ',
'errors': [{'position': 18, 'correction': {'мне': 'β'}}]}]
from transformers import BertTokenizerFast
from textgen import BartSeq2SeqModel
tokenizer = BertTokenizerFast.from_pretrained('shibing624/bart4csc-base-chinese')
model = BartSeq2SeqModel(
encoder_type='bart',
encoder_decoder_type='bart',
encoder_decoder_name='shibing624/bart4csc-base-chinese',
tokenizer=tokenizer,
args={"max_length": 128, "eval_batch_size": 128})
sentences = [«Пионеры должны уступить места старикам»]
print(model.predict(sentences))
output:
['Юные пионеры должны уступить места старикам']
Если вам нужно обучить модель Барта, см. https://github.com/shibing624/textgen/blob/main/examples/seq2seq/training_bartseq2seq_zh_demo.py
Модель Барта, обученная на основе китайского набора данных для исправления ошибок SIGHAN+Wang271K, была опубликована в HuggingFace Models:
№3 8.4 Модель ConvSeq2Seq
Пример использования модели pycorrector/seq2seq:
cd seq2seq
python train.py
convseq2seq
тренироватьсяsighanНабор данных(2104полосовой образец),200 эпох,Одна карта P40GPUтренироваться занимает: 3 минуты.
python infer.py
output:
unk
из Состояние,Решение: увеличить выборку тренироваться.,Используйте исправление ошибок, представленное ниже (nlpcc2018+hsk,1,3 миллиона пар предложений) попробуйте.Модель convseq2seq, обученная на основе набора данных SIGHAN2015, была опубликована на github:
Набор данных | корпус | Ссылка для скачивания | Размер сжатой упаковки |
---|---|---|---|
| СИГАН+Ванг271K(270 000 шт.) | 106M | |
| SIGHAN13 14 15 | 339K | |
| Wang271K | 93M | |
| People's Daily, выпуск 2014 г. | 383M | |
| NLPCC2018-GEC | 114M | |
| nlpcc2018+hsk+CGED | 215M | |
| HSK+Lang8 | 81M | |
| Chinese Text Correction(CTC) | - |
проиллюстрировать:
SIGHAN+Wang271K Набор для исправления ошибок на китайском языке данные, формат данных:
[
{
"id": "B2-4029-3",
"original_text": «Вы будете слышать голоса ночью. Днем люди не обращают на них особого внимания, но когда они спят, голоса становятся кошмаром для каждого».
"wrong_ids": [
5,
31
],
"correct_text": «Ночью вы услышите шум. Днем люди не обращают на него особого внимания, но во время сна шум становится кошмаром для каждого».
}
]
Объяснение поля:
Вы можете использовать свой собственный набор данныхтренироваться Коррекция Модель,Отметьте себя Набор данных,Сохранить как следоватьтренироваться样本набор一样изформат json,然后нагрузка数据тренироваться Модель Вот и все。
Что такое языковая модель? -вики
язык Модель对于Коррекция步骤至关重要,В настоящее время используется по умолчаниюизда从千兆中文文本тренироватьсяиз中文язык Модельzh_giga.no_cna_cmn.prune01244.klm(2.8G),
ОбеспечитьPeople's Daily, выпуск 2014 г.корпустренироватьсяполучатьиз轻量版язык Модельлюди2014corpus_chars.klm (пароль o5e9)。
Вы можете использовать китайскую Wiki(Преобразование традиционного китайского языка в упрощенный китайский,Эта функция доступна в pycorrector.utils.text_utils) и других корпусах данныхтренироваться в общих чертах из языковой модели.,Или вы можете использовать более специализированную языковую модель в профессиональной сфере корпустренироваться. Больше подходит для языковой модели,Эффект исправления ошибок будет лучше улучшен.
Справочная ссылка:https://github.com/shibing624/pycorrector