Shanraq.org Shanraq.org
IT

AI без LLM: создаем свою модель ИИ Урок 24 из 30

Урок 24. Правило достаточного основания

Дежурный видит в записке слова «когда» и «где». Даже если «когда» повторено дважды, он не должен решать за автора, какой вопрос важнее. Наш счётчик из прошлого урока ошибся именно так.

Текст переведён с помощью ИИ.

Зачем это нужно

Дежурный видит в записке слова «когда» и «где». Даже если «когда» повторено дважды, он не должен решать за автора, какой вопрос важнее. Наш счётчик из прошлого урока ошибся именно так.

До программы

Оставляем обученные счётчики и проверяем вопрос до выбора типа. time_cue показывает наличие ясного слова о времени, place_cue — о месте. Здесь разрешены только уже изученные формы қашан, уақыты, қайда, орны. or значит «хотя бы одно из двух», and требует обе части, not меняет «да» на «нет». Правило: выбираем тип, только если есть его явный признак, нет признака другого типа и счёт больше. Два вида или отсутствие ясного признака дают отказ.

Скопируйте examples.json в ту же папку, что и программа. Печатать все 13 карточек повторно не нужно: формат объяснён в уроке 22.

Из корня проекта перейдите в папку шага и запустите программу:

cd course/kazakh-ai/step-24
python3 gate.py

В Windows вместо последней команды выполните py gate.py.

import json

with open("examples.json", encoding="utf-8") as file:
    rows = json.load(file)
weights = {}
for row in rows:
    if row["split"] == "train":
        words = row["text"].lower().replace("?", "").replace(",", "").split()
        for word in words:
            for feature in [word, word[:4]]:
                if feature not in weights:
                    weights[feature] = {"уақыт": 0, "орын": 0}
                weights[feature][row["label"]] += 1
for row in rows:
    if row["split"] == "tune":
        scores = {"уақыт": 0, "орын": 0}
        words = row["text"].lower().replace("?", "").replace(",", "").split()
        for word in words:
            for feature in [word, word[:4]]:
                if feature in weights:
                    scores["уақыт"] += weights[feature]["уақыт"]
                    scores["орын"] += weights[feature]["орын"]
        time_cue = "қашан" in words or "уақыты" in words
        place_cue = "қайда" in words or "орны" in words
        if time_cue and not place_cue and scores["уақыт"] > scores["орын"]:
            prediction = "уақыт"
        elif place_cue and not time_cue and scores["орын"] > scores["уақыт"]:
            prediction = "орын"
        else:
            prediction = "білмеймін"
        print(row["text"], "→", prediction)

Файлы шага.

Как работает код

Последний вопрос настройки теперь даёт білмеймін, хотя счёт времени больше: place_cue тоже истинно. Шахмат нешеде? остаётся без ответа — форма ещё не объяснена примерами и правилом. Это намеренная неполнота: позже можно расширить обучающий набор, затем отдельно проверить новый вариант. Достаточное основание для выбора типа ещё не означает достаточное основание для ответа о расписании: перед ним нужны карточка факта, источник и срок из уроков 16–20.

Опорная карта

Обученный счёт + явный признак одного типа + отсутствие другого → тип; иначе → отказ. Факт проверяется отдельно.

Вспомните и проверьте

Закройте код и восстановите три условия для ответа о времени. Запустите пять настроечных вопросов. Эталон: уақыт, орын, затем три раза білмеймін. Подсказка: на последнем вопросе истинны и time_cue, и place_cue; проверка not place_cue останавливает выбор. Частая ошибка: убрать проверку второго признака, потому что счёт времени больше. Тогда снова получится неверный выбор из урока 23.

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Комментарии (0)

Пока нет комментариев. Будьте первым.