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)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.