Я пытаюсь разобрать книгу в формате .txt, чтобы узнать больше об attoparsec и Haskell (я новичок). В этом случае я пытаюсь подсчитать количество предложений в данном текстовом файле. Вот мой код:
{-# LANGUAGE OverloadedStrings #-}
import Data.Attoparsec.Text
import qualified Data.Text as T
import qualified Data.Text.IO as Txt
import Data.List
import Control.Applicative ((<*>), (*>), (<$>), (<|>), pure)
data Prose = Prose {
word :: [Char]
} deriving Show
optional :: Parser a -> Parser ()
optional p = option () (try p *> pure ())
specialChars = ['-', '_', '…', '“', '”', '\"', '\'', '’', '@', '#', '$',
'%', '^', '&', '*', '(', ')', '+', '=', '~', '`', '{', '}',
'[', ']', '/', ':', ';', ',']
inputSentence :: Parser Prose
inputSentence = Prose <$> many1' (letter <|> digit <|> space <|> satisfy (inClass specialChars))
sentenceSeparator :: Parser ()
sentenceSeparator = many1 (space <|> satisfy (inClass ".?!")) >> pure ()
sentenceParser :: String -> [Prose]
sentenceParser str = case parseOnly wp (T.pack str) of
Left err -> error err
Right x -> x
where
wp = optional sentenceSeparator *> inputSentence `sepBy1` sentenceSeparator
main :: IO()
main = do
input <- readFile "test.txt"
let sentences = sentenceParser input
print sentences
print $ length sentences
Нажмите эту ссылку на репозиторий github, если вы хотите полностью взглянуть на то, что я делаю.
Моя проблема в том, что когда я пытаюсь проанализировать текстовый файл с помощью ввода:
Я получаю вывод следующим образом:
Итак, мой вопрос, как я могу:
- Заставьте синтаксический анализатор понять, что что-либо с "\ n \ n .." - это другое предложение.
- Ввод, например,
Daniel G. Brinton
- это всего лишь одно предложение.
Я пытался использовать isHorizontalSpace
, но безрезультатно.