Участник:BsivkoBot/Орфография

Описание

Мотивация

В ряде случаев имеют место массовые ошибки орфографии, допускаемые разными участниками и по разным причинам. Эти ошибки не всегда могут быть идентифицированы автоматически, так как зависят от контекста. Однако, если подобрать часто встречаемый контекст, то можно идентифицировать его и исправить ошибку, которую вручную пришлось бы исправлять долго. Кроме того, на подобные исправления вручную не всегда у участников находится желание.

Бот может перирать известные ему контексты и пробовать их испрвлять. Поиск может вестись через поисковую систему проекта. Например, можно обработать все статьи, выдаваемые поиском на «закончил школу», и попробовать заменить внутри все «закончил школу» → «окончил школу». Это минимизирует число ошибок, но не всегда позволяет разрешить определить все случаи. Например, Закончил [[школа|Школу]] распознать сложно, и предугадать все контексты не получится (например, «поступил в школу и закончил её в 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)

Обсуждение