Генерация фраз

This commit is contained in:
2024-12-09 19:00:08 +03:00
parent 93bb0f247c
commit 58aefa43c5
4 changed files with 38 additions and 4 deletions

View File

@@ -1,7 +1,6 @@
module Main (main) where module Main (main) where
import Lib import Lib
import UnescapingPrint (uprint)
main :: IO () main :: IO ()
main = main =
@@ -9,6 +8,8 @@ main =
getLine >>= \fileName -> getLine >>= \fileName ->
readFile fileName >>= \content -> readFile fileName >>= \content ->
let sentences = splitText content in let sentences = splitText content in
uprint (take 10 sentences) >>
let dict = buildDictionary sentences in let dict = buildDictionary sentences in
saveDictionary "dict.txt" dict saveDictionary "dict.txt" dict >>
putStrLn "Введите слово или пару слов:" >>
getLine >>= \input ->
processInput dict input

View File

@@ -22,6 +22,7 @@ description: Please see the README on GitHub at <https://github.com/gith
dependencies: dependencies:
- base >= 4.7 && < 5 - base >= 4.7 && < 5
- containers - containers
- random
- unescaping-print - unescaping-print
ghc-options: ghc-options:

View File

@@ -36,6 +36,7 @@ library
build-depends: build-depends:
base >=4.7 && <5 base >=4.7 && <5
, containers , containers
, random
, unescaping-print , unescaping-print
default-language: Haskell2010 default-language: Haskell2010
@@ -52,6 +53,7 @@ executable part2-exe
base >=4.7 && <5 base >=4.7 && <5
, containers , containers
, part2 , part2
, random
, unescaping-print , unescaping-print
default-language: Haskell2010 default-language: Haskell2010
@@ -69,5 +71,6 @@ test-suite part2-test
base >=4.7 && <5 base >=4.7 && <5
, containers , containers
, part2 , part2
, random
, unescaping-print , unescaping-print
default-language: Haskell2010 default-language: Haskell2010

View File

@@ -5,6 +5,7 @@ import Data.Map (Map)
import qualified Data.Map as Map import qualified Data.Map as Map
import Data.List (nub, tails) import Data.List (nub, tails)
import System.IO import System.IO
import System.Random (StdGen, randomR, newStdGen) -- mkStdGen
import UnescapingPrint (ushow) import UnescapingPrint (ushow)
@@ -41,4 +42,32 @@ buildDictionary sentences =
saveDictionary :: FilePath -> Map String [String] -> IO () saveDictionary :: FilePath -> Map String [String] -> IO ()
saveDictionary filePath dict = withFile filePath WriteMode $ \h -> saveDictionary filePath dict = withFile filePath WriteMode $ \h ->
mapM_ (\(k,v) -> hPutStrLn h $ ushow k ++ ": " ++ ushow v) (Map.toList dict) mapM_ (\(k,v) -> hPutStrLn h $ ushow k ++ ": " ++ ushow v) (Map.toList dict)
generatePhrase :: Map String [String] -> String -> StdGen -> [String]
generatePhrase dict start initGenState =
-- let (len, initGenState') = (2 :: Int, initGenState)
let (len, initGenState') = randomR (2,15 :: Int) initGenState
in reverse $ gp start [] len initGenState'
where
gp :: String -> [String] -> Int -> StdGen -> [String]
gp key acc n genState
| n <= 0 = acc
| otherwise =
case Map.lookup key dict of
Nothing -> acc
Just [] -> acc
Just vals ->
let (i, newGenState) = randomR (0, length vals - 1) genState
next = vals !! i
in
gp next (next:acc) (n - length (words next)) newGenState
processInput :: Map String [String] -> String -> IO ()
processInput dict input =
if Map.member input dict then
-- let gen = mkStdGen 42 in
newStdGen >>= \gen ->
putStrLn $ unwords $ generatePhrase dict input gen
else
putStrLn "Нет в словаре"