Shanraq.org Shanraq.org
IT

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

Урок 27. Проверяем опечатки и чужие темы

Вахтёр сверяет имя посетителя со списком. Если имя неразборчиво или человек просит сразу два пропуска, вахтёр уточняет, а не угадывает. Наш классификатор тоже должен остановиться на незнакомом слове, опечатке и вопросе сразу о времени и месте.

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

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

Вахтёр сверяет имя посетителя со списком. Если имя неразборчиво или человек просит сразу два пропуска, вахтёр уточняет, а не угадывает. Наш классификатор тоже должен остановиться на незнакомом слове, опечатке и вопросе сразу о времени и месте.

Перед кодом

Файл examples.json содержит 13 открытых обучающих и настроечных карточек урока 24; контрольные метки сюда не копируем. Код обучает прежние счётчики, затем добавляет охрану входа. Фигурные скобки без двоеточий образуют множество allowed: оно хранит допустимые слова, а in и not in проверяют принадлежность. def classify(question): определяет функцию — повторно используемый рецепт с входом question. return завершает рецепт и отдаёт словарь результата. Строка if __name__ == "__main__": запускает пять примеров лишь при прямом запуске файла; когда другой файл импортирует classify, примеры не печатаются. Это служебные имена Python, их не нужно менять.

Файлы этого шага: examples.json, checks.py.

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

cd course/kazakh-ai/step-27
python3 checks.py

В Windows замените python3 на 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("?", "").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


def classify(question):
    text = question.lower().replace("?", "").replace(",", "").replace(".", "")
    words = text.split()
    allowed = {"шахмат", "сурет", "қашан", "қайда", "уақыты", "орны", "өтеді", "болады"}
    for word in words:
        if word not in allowed:
            return {"status": "refuse", "reason": "білмеймін: таныс емес сөз"}
    clubs = []
    for word in words:
        if word in ["шахмат", "сурет"]:
            clubs.append(word)
    if len(clubs) != 1:
        return {"status": "refuse", "reason": "нақтылаңыз: бір үйірме керек"}
    scores = {"уақыт": 0, "орын": 0}
    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["орын"]:
        return {"status": "ready", "club": clubs[0], "kind": "уақыт"}
    if place_cue and not time_cue and scores["орын"] > scores["уақыт"]:
        return {"status": "ready", "club": clubs[0], "kind": "орын"}
    return {"status": "refuse", "reason": "нақтылаңыз: бір сұрақ түрі керек"}


if __name__ == "__main__":
    for question in ["Шахмат қашан?", "Шахмаат қашан?", "Шахмат неге?",
                     "Шахмат қашан интернет?", "Шахмат қашан қайда?"]:
        print(question, "→", classify(question))

Файлы шага.

Что делает программа

Ввод сначала приводится к маленьким буквам и очищается от ?, ,, .. Затем каждое слово сверяется с закрытым списком. Шахмаат не превращается молча в шахмат; появляется білмеймін: таныс емес сөз. Чужая тема тоже останавливается. После этого проверяются ровно одно название, счётчики и явные признаки: два вида вопроса возвращают просьбу уточнить. Такой строгий список откажет и на некоторых понятных человеку фразах; это честный предел маленькой модели. Значение ready означает только «вид вопроса установлен», не «факт найден».

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

Слова → все разрешены? → ровно один кружок? → один ясный тип со счётом? → ready; иначе причина отказа.

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

Закройте код и назовите проверки в порядке выполнения. Эталон: Шахмат қашан? даёт ready, Шахмаат қашан? и Шахмат қашан интернет? — отказ из-за незнакомого слова, Шахмат қашан қайда? — уточнение вида. Подсказка: первая неподходящая проверка возвращает результат и прекращает функцию. Частая ошибка: считать ready готовым расписанием; поиск в каталоге начинается позже.

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

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

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