Раз показана улица - PullRequest
       1

Раз показана улица

0 голосов
/ 09 ноября 2018

Я сделал функцию для чтения .txt файла и превращения его в строку.

Отсюда мне нужна помощь в сборе количества показанных слов.

Но я не уверен, куда идти отсюда, и любая помощь с любым из пунктов будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вот еще один способ использования Regex

open System.Text.RegularExpressions

let str = "Some (very) long string with some repeated words again, and some other words, and some punctuation too."

str 
|> (Regex @"\W+").Split
|> Seq.choose(fun s -> if s = "" then None else Some (s.ToLower()))
|> Seq.countBy id
|> Seq.sortByDescending snd
0 голосов
/ 09 ноября 2018

Давайте пройдем этот шаг за шагом, создавая функцию для каждого бита:

Преобразование слов, начинающихся с прописных букв, в строчные слова, чтобы все слова были строчными.

Разделить строку на последовательность слов:

let getWords (s: string) = 
    s.Split(' ')

Превращает "привет мир" в ["hello"; "world"]

Сортировать количество отображаемых слов. Слово в этом смысле представляет собой последовательность символов без пробелов и знаков препинания (! # = И т. Д.)

Часть # 1: отформатировать слово в нижнем регистре без знаков препинания:

let isNotPunctuation c = 
    not (Char.IsPunctuation(c))

let formatWord (s: string) = 
    let chars = 
        s.ToLowerInvariant()
        |> Seq.filter isNotPunctuation
        |> Seq.toArray

    new String(chars)

Включает "Привет!" в "привет".

Часть # 2: Сгруппировать список слов по его форматированной версии.

let groupWords (words: string seq) = 
    words
    |> Seq.groupBy formatWord

Возвращает кортеж, первая часть которого является ключом (formatWord), вторая часть представляет собой список слов.

Превращает ["hello"; "world"; "hello"] в

[("hello", ["hello"; "hello"]);
 ("world", ["world"])]

Сортировка от наиболее часто встречающегося слова и до менее частого.

let sortWords group = 
    group
    |> Seq.sortByDescending (fun g -> Seq.length (snd g))

Сортировка списка по убыванию (по возрастанию) по length (количеству) элементов во второй части - см. Приведенное выше представление.

Теперь нам просто нужно очистить вывод:

let output group =
    group
    |> Seq.map fst

Это выбирает первую часть кортежа из группы:

Превращает ("hello", ["hello"; "hello"]) в "привет".


Теперь у нас есть все функции, мы можем соединить их в одну цепочку:

let s = "some long string with some repeated words again and some other words"

let finished = 
    s
    |> getWords
    |> groupWords
    |> sortWords
    |> output

printfn "%A" finished
//seq ["some"; "words"; "long"; "string"; ...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...