我已经实现了读取.txt文件并将其转换为字符串的功能。
从这里开始,我需要帮助收集单词显示的次数。
但是我不确定从这里可以去哪里,对任何要点的任何帮助将不胜感激。
答案 0 :(得分:3)
然后逐步进行此操作,为每个位创建一个函数:
将以大写字母开头的单词转换为小写字母,以便所有单词均为小写字母。
将字符串分割成单词序列:
let getWords (s: string) =
s.Split(' ')
将“ hello world”切换为["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"; ...]
答案 1 :(得分:1)
这是使用正则表达式的另一种方式
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