ai-lab2/lib/ai/console.ex
2025-11-06 23:55:47 +03:00

110 lines
2.7 KiB
Elixir
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

defmodule Ai.Console do
def child_spec(_) do
%{
id: __MODULE__,
start:
{Task, :start_link,
[
fn ->
handle_command("help")
loop()
end
]},
restart: :permanent,
shutdown: 5000,
type: :worker
}
end
def loop() do
case IO.gets("> ") do
:eof ->
:ok
{:error, _} ->
:ok
lines ->
lines
|> String.trim()
|> handle_command()
loop()
end
end
defp handle_command("") do
# Do nothing
end
defp handle_command("start") do
case IO.gets(
"Опишите свой характер, например, \"Я довольно спокойный человек и стараюсь не поддаваться эмоциям в сложных ситуациях.\"\n?> "
) do
:eof ->
:ok
{:error, _} ->
:ok
lines ->
film =
lines
|> normalize()
|> filterWords()
|> getFilm()
if String.length(film) > 0 do
IO.puts("Рекомендации от меня - #{film}")
else
IO.puts(
"К сожалению, я не смог найти фильм для Вас. Попробуйте описать себя, используя прилагательные"
)
end
end
end
defp handle_command("exit") do
IO.puts("Пока-пока!")
System.halt()
end
defp handle_command("help") do
intellectualniy = IO.ANSI.italic() <> "интеллектуальный" <> IO.ANSI.reset()
start = IO.ANSI.bright() <> "start" <> IO.ANSI.reset()
IO.puts("""
Я робот Макс™ - #{intellectualniy} помощник.
Я могу посоветовать Вам фильм, на основе вашего психологического портрета.
Для начала работы напишите команду #{start}.
Также доступны следующие команды:
- help - вывести данное сообщение
- exit - выйти из программы :(
""")
end
defp handle_command(command) do
IO.puts("Я не знаю команду #{command}. Для просмотра доступных команд введите help.")
end
defp normalize(text) do
text
|> String.trim()
|> String.normalize(:nfkd)
|> Ai.Morphy.normalize()
end
defp filterWords(words) do
words
|> Stream.map(&String.downcase/1)
|> Stream.dedup()
|> Enum.filter(&Enum.member?(Ai.Words.words(), &1))
end
defp getFilm(wordsList) do
wordsList
|> Ai.Prolog.query()
end
end