Dans le cadre de l'exercice pour mieux comprendre F # que j'apprends actuellement, j'ai écrit la fonction à diviser la chaîne donnée en n-grammes.
1) J'aimerais recevoir des commentaires sur ma fonction: cela peut-il être écrit plus simplement ou de manière plus efficace? Fonction de partage de N-gramme pour comparaison de similarité de chaîne
2) Mon objectif général est d'écrire une fonction qui retourne une similarité de chaîne (sur une échelle de 0.0 .. 1.0) basée sur la similarité de n-gram; Cette approche fonctionne-t-elle bien pour les comparaisons de chaînes courtes, ou cette méthode peut-elle être utilisée de manière fiable pour comparer de grandes chaînes (comme des articles par exemple).
3) Je suis conscient du fait que les comparaisons de n-grammes ignorent le contexte de deux chaînes. Quelle méthode suggéreriez-vous pour atteindre mon but?
//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)
)
Dommage que je ne peux pas marquer plusieurs réponses comme acceptée: P Merci à tous! – Michael