N-grams: Difference between revisions

1,626 bytes added ,  1 month ago
Add Miranda
(Add Refal)
(Add Miranda)
Line 549:
(" l", 2) ("le", 1) ("et", 1) ("t ", 1) ("li", 1)
</pre>
 
=={{header|Miranda}}==
<syntaxhighlight lang="miranda">main :: [sys_message]
main = concat (map (testcase s) [2,3,4])
where s = "LIVE AND LET LIVE"
 
testcase :: [char]->num->[sys_message]
testcase s n = [Stdout (show n ++ "-grams of '" ++ s ++ ":'\n"),
Stdout (showngrams n s),
Stdout "\n"]
 
showngrams :: num->[char]->[char]
showngrams n s = lay (map concat (splitn 6 cols))
where ng = ngrams n s
cols = [ljustify 12 (showngram ng') | ng'<-ng]
 
showngram :: ([char],num)->[char]
showngram (s,i) = concat ["\"", s, "\": ", show i]
 
splitn :: num->[*]->[[*]]
splitn n [] = []
splitn n ls = take n ls:splitn n (drop n ls)
 
ngrams :: num->[*]->[([*],num)]
ngrams n = count . group n
 
group :: num->[*]->[[*]]
group n ls = [], if #ls < n
group n ls = take n ls : group n (tl ls)
 
count :: [*]->[(*,num)]
count = foldl incelem []
 
incelem :: [(*,num)]->*->[(*,num)]
incelem [] el = [(el, 1)]
incelem ((el,n):cs) el = (el,n+1):cs
incelem (c:cs) el = c:incelem cs el</syntaxhighlight>
{{out}}
<pre>2-grams of 'LIVE AND LET LIVE:'
"LI": 2 "IV": 2 "VE": 2 "E ": 1 " A": 1 "AN": 1
"ND": 1 "D ": 1 " L": 2 "LE": 1 "ET": 1 "T ": 1
 
3-grams of 'LIVE AND LET LIVE:'
"LIV": 2 "IVE": 2 "VE ": 1 "E A": 1 " AN": 1 "AND": 1
"ND ": 1 "D L": 1 " LE": 1 "LET": 1 "ET ": 1 "T L": 1
" LI": 1
 
4-grams of 'LIVE AND LET LIVE:'
"LIVE": 2 "IVE ": 1 "VE A": 1 "E AN": 1 " AND": 1 "AND ": 1
"ND L": 1 "D LE": 1 " LET": 1 "LET ": 1 "ET L": 1 "T LI": 1
" LIV": 1</pre>
 
=={{header|Nim}}==
2,115

edits