Разбор предложений в Haskell более эффективно с помощью attoparsec - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь разобрать книгу в формате .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, если вы хотите полностью взглянуть на то, что я делаю. Моя проблема в том, что когда я пытаюсь проанализировать текстовый файл с помощью ввода: enter image description here

Я получаю вывод следующим образом:

enter image description here

Итак, мой вопрос, как я могу:

  1. Заставьте синтаксический анализатор понять, что что-либо с "\ n \ n .." - это другое предложение.
  2. Ввод, например, Daniel G. Brinton - это всего лишь одно предложение.

Я пытался использовать isHorizontalSpace, но безрезультатно.

...