salut a tous je porte un de mes scripts perl en C#, celui-ci est destiné a comparer un texte ( sous forme de trigramme ) aves des dictionnaires de trigrammes afin de déterminer la langue du document .
Mon problème en C# vient du fait que je ne sais pas comment trier ma hashtable finale rangé par ( langue, valeur (int)), retourner la langue ayant le plus grand score, néanmoins il peut arriver sur deux langues soit a égélité auquel cas la première qui tombe sous le main de l'algo est renvoyé.
En perl j'utilise l'excellent module List::Util plus précisement la fonction réduce, afin de déterminer qu'elle langue a gagner.
mon code C# est le suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public string compare_profiles(string content) { Hashtable res = new Hashtable(); int incr = 0; string min = content.ToLower(); string[] doc_ngrams = ngram.GenerateNGrams(min, 3); IDictionaryEnumerator enumerator = dictionnaries.GetEnumerator(); while (enumerator.MoveNext()) { string key = enumerator.Value.ToString(); Hashtable hash = (Hashtable)dictionnaries[key]; foreach (string key2 in doc_ngrams) { if ( hash.ContainsKey(key2) ) { incr++; } } res.Add(incr, key); incr = 0; } // ?????? Comment faire ? }
et mon code perl !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 package Text::LanguageDetermine; use List::Util qw/reduce/; sub new { my $class = shift; my $dicos = shift; return bless { Dic => $dicos }, $class; } sub set_dicos { my $self = shift; my $dico = shift; $self->{'Dic'} = $dico; } sub compare_profiles { my $self = shift; my $text = shift; my $count = 0; my %cnt_by_dico; foreach my $dic ( keys %{$self->{'Dic'}} ) { foreach my $one ( keys %$text ) { $count++ if exists $hook->{$dic}{$one}; } $cnt_by_dico{$dic} = $count; $count = 0; } return reduce { $cnt_by_dico{$a} > $cnt_by_dico{$b} ? $a : $b } (sort keys %$hook); } 1; __END__
merci a vous
Partager