Дописки к особенностям реализации второй части

This commit is contained in:
2024-12-10 12:12:31 +03:00
parent ca62ba2dc3
commit 56b2555e15

View File

@@ -463,7 +463,9 @@ generatePhrase dict start initGenState =
in gp next (next:acc) (n - length (words next)) newGenState
\end{lstlisting}
Функция \texttt{processInput} (листинг~\ref{lst:processInput}) проверяет, существует ли введённое пользователем слово(или пара слов) в словаре, и если да — генерирует фразу.
\subsubsection{Функция processInput}
Функция \texttt{processInput}, код которой представлен в листинге~\ref{lst:processInput}, проверяет, существует ли введённое пользователем слово (или пара слов) в словаре, и генерирует фразу, используя функцию \texttt{generatePhrase}. Функция принимает на вход словарь и строку с пользовательским вводом. Явно ничего не возвращает, но выводит результаты в консоль.
\begin{lstlisting}[caption={Функция processInput для обработки пользовательского ввода}, label={lst:processInput}]
processInput :: Map String [String] -> String -> IO ()
@@ -477,7 +479,14 @@ processInput dict input =
\subsubsection{Функция twoModelsDialog}
Реализован режим, в котором две модели N-грамм, построенные на разных текстах, обмениваются сообщениями. Начальное слово или пару слов задаёт пользователь, затем модели по очереди генерируют ответы, основываясь на словах, из которых состоит последнее сообщение их собеседника. Код, реализующий диалог, представлен в листинге~\ref{lst:twoModelsDialog}.
Функция \texttt{twoModelsDialog}, код которой представлен в листинге~\ref{lst:twoModelsDialog}, симулирует диалог между двумя моделями N-грамм. Начальное слово или пару слов задаёт пользователь, затем модели по очереди генерируют ответы, основываясь на словах, из которых состоит последнее сообщение их собеседника. Функция \texttt{twoModelsDialog} принимает на вход два словаря N-грамм, строку с пользовательским вводом, в котором содержится стартовая N-грамма, и число -- наибольшее количество сообщений от каждой модели.
Внутри \texttt{twoModelsDialog} используются две вспомогательные функции:
\begin{itemize}
\item \texttt{findKeyForResponse} -- ищет в ответе собеседника слово, на которое модель способна дать ответ. Принимает на вход словарь N-грамм и список строк -- предложение с ответом собеседника. Возвращает строку с подходящим словом, если его удалось найти. Поиск слов идёт с конца предложения собеседника.
\item \texttt{dialogStep} -- генерирует ответ с помощью функции \texttt{generatePhrase} на основе слова из предложения собеседника, найденного с помощью \texttt{findKeyForResponse}. Принимает на вход словарь N-грамм и список N-грамм -- предложение собеседника. Если удалось сгенерировать ответ, то возвращает его в виде списка N-грамм.
\end{itemize}
\begin{lstlisting}[caption={Функция twoModelsDialog для организации диалога между двумя моделями}, label={lst:twoModelsDialog}]
twoModelsDialog :: Map String [String] -> Map String [String] -> String -> Int -> IO ()
@@ -497,9 +506,22 @@ twoModelsDialog dict1 dict2 start m =
dialogStep d1 resp >>= \resp2 ->
if null resp2 then return () else
loop d1 d2 resp2 (i-1)
\end{lstlisting}
Данный подход позволяет динамически генерировать фразы и организовывать имитацию диалога между двумя текстовыми моделями, что служит демонстрацией возможностей построенной системы N-грамм.
findKeyForResponse :: Map String [String] -> [String] -> Maybe String
findKeyForResponse dict ws =
case dropWhile (\w -> Map.notMember w dict) (reverse ws) of
[] -> Nothing
(x:_) -> Just x
dialogStep :: Map String [String] -> [String] -> IO [String]
dialogStep dict prevPhrase =
case findKeyForResponse dict (words $ unwords prevPhrase) of
Nothing -> putStrLn "Нет в словаре" >> return []
Just key ->
newStdGen >>= \gen ->
let p = generatePhrase dict key gen
in putStrLn ("(" ++ key ++ ") " ++ unwords p) >> return p
\end{lstlisting}