現在学習しているF#をよりよく理解するための演習の一環として、指定された文字列をnグラムに分割する関数を作成しました。
1)自分の関数に関するフィードバックを受け取りたい:これはもっと簡単に、またはもっと効率的に書くことができますか?
2)私の全体的な目標は、n-gramの類似性に基づいて文字列の類似性(0.0 .. 1.0スケール)を返す関数を作成することです。このアプローチは短い文字列の比較に適していますか、またはこの方法を使用して大きな文字列(記事など)を確実に比較できますか?
3)n-gram比較が2つの文字列のコンテキストを無視するという事実を認識しています。私の目標を達成するためにどのような方法を提案しますか?
//s:string - target string to split into n-grams
//n:int - n-gram size to split string into
let ngram_split (s:string, n:int) =
let ngram_count = s.Length - (s.Length % n)
let ngram_list = List.init ngram_count (fun i ->
if( i + n >= s.Length ) then
s.Substring(i,s.Length - i) + String.init ((i + n) - s.Length)
(fun i -> "#")
else
s.Substring(i,n)
)
let ngram_array_unique = ngram_list
|> Seq.ofList
|> Seq.distinct
|> Array.ofSeq
//produce tuples of ngrams (ngram string,how much occurrences in original string)
Seq.init ngram_array_unique.Length (fun i -> (ngram_array_unique.[i],
ngram_list |> List.filter(fun item -> item = ngram_array_unique.[i])
|> List.length)
)