Описание
Мотивация
В ряде случаев имеют место массовые ошибки орфографии, допускаемые разными участниками и по разным причинам. Эти ошибки не всегда могут быть идентифицированы автоматически, так как зависят от контекста. Однако, если подобрать часто встречаемый контекст, то можно идентифицировать его и исправить ошибку, которую вручную пришлось бы исправлять долго. Кроме того, на подобные исправления вручную не всегда у участников находится желание.
Бот может перирать известные ему контексты и пробовать их испрвлять. Поиск может вестись через поисковую систему проекта. Например, можно обработать все статьи, выдаваемые поиском на «закончил школу», и попробовать заменить внутри все «закончил школу» → «окончил школу». Это минимизирует число ошибок, но не всегда позволяет разрешить определить все случаи. Например, Закончил [[школа|Школу]]
распознать сложно, и предугадать все контексты не получится (например, «поступил в школу и закончил её в 1900 году»).
Реализация
Бот обрабатывает весь исходный текст страницы на множество разных контекстов и соответствующих им заменам.
В настоящее время обабатываются следующие задачи:
Конфигурация описана на следующей странице:
Исходный код
import json
import pywikibot
TASK_DESCRIPTION_GRAMOTA = u"орфография"
def get_gramotalist():
pagename = "Участник:BsivkoBot/Орфография/Конфигурация"
site = pywikibot.Site()
page = pywikibot.Page(site, pagename)
text = str(page.text)
return json.loads(text)
def get_single_or_list_as_list(value):
if isinstance(value, list):
return value
if value is None:
return value
return [value]
def perform_tasks(text, tasks, title):
for task in tasks:
details = task.get("общая_замена")
if details is not None:
names = get_single_or_list_as_list(details.get("что"))
if names is None:
continue
to_replace = details.get("на_что")
if to_replace is None:
continue
for i in names:
text = text.replace(i, to_replace)
details = task.get("общая_замена_список")
if details is not None:
for key, value in details.items():
text = text.replace(key, value)
return text
def gramota_for_article(text, cfg, title="unknown"):
if cfg.get("задачи") is not None:
tasks = cfg["задачи"]
return perform_tasks(text, tasks, title)
return text
Тестирование
import mwparserfromhell
from gramota.gramota_script import gramota_for_article
cfg = {
"задачи": [
{
"общая_замена": {
"что": "В отличии от",
"на_что": "В отличие от"
}
},
{
"общая_замена": {
"что": "в отличии от",
"на_что": "в отличие от"
}
}
]
}
def get_template(text, title):
parsed = mwparserfromhell.parse(text)
for template in parsed.ifilter_templates():
if template.name.matches(title):
return template
return None
def test_gramota_for_article():
text = gramota_for_article("Ежики, в отличии от яблок, размножаются почкованием. В отличии от мышей, живут в лесу.",
cfg)
assert "отличие" in text
assert "отличии" not in text
Состояние и развитие
- Первые запуски. Bsivko (обс.) 23:31, 21 октября 2019 (UTC)
Обсуждение