gilou Modérateur Modzilla | Bon, j'ai eu le temps de regarder cela d'un peu plus près, vu que je bosse pas aujourd'hui.
Suite a vos mails en MP, je ferais ainsi:
Code :
#!/usr/bin/env perl use strict; use warnings; use autodie; # Pour virer la BOM utf8 (inutile mais hélas mise par MS-Windows, et qui s'incruste au premier mot du corpus). use File:: BOM qw(open_bom ); sub build_corpus($) { my %corpus; while (<$fh> ) { $corpus{$_} = {}; } } sub parse_data($$) { my $linenum; while (<$fh> ) { ++$linenum; # ou le mettre avant le chomp si on ne veut aussi compter les lignes vides if ($corpus->{$_}) { $corpus->{$_}{$linenum}++; } } } } sub idf($$$) { if ($corpus->{$mot}) { if ($matchlines) { } else { # ou ce que vous voulez pour un mot du corpus sans occurence dans les données } } else { # mot pas dans le corpus } } sub save_result($$$) { print $fh $_, " : ", idf ($corpus, $nblignes, $_), "\n"; } } ############### # les données # ############### my $corpus_file = "file1.txt"; my $data_file = "file2.txt"; my $result_file = "file3.txt"; ################# # le traitement # ################# print "Lecture du corpus..."; my $corpus = build_corpus($corpus_file); print "Lecture des lignes..."; my $nblignes = parse_data($corpus, $data_file); print "OK. ", $nblignes, " lignes lues\n"; print "Ecriture des resultats..."; save_result($corpus, $nblignes, $result_file);
|
Vu la taille de votre corpus, 1M de mots et 4M de lignes, c'est ce que je pense être le plus efficace.
Le seul endroit ou ca risque de ne pas satisfaire vos besoins, c'est le split /\b/.
En effet, si vos données sont en unicode, il n'est pas certain que cela ne splitte pas sur tout caractère accentué ou inhabituel.
Auquel cas, il faudra remplacer le /\b/ par une expression régulière plus adaptée (\b{wb}\ ?).
En tout cas, j'ai testé vite fait avec un mot comme Sørensen ou حاطه et il y avait pas de pb avec \b
Pour les perfs, on lit chaque ligne une seule fois, donc ça devrait rester acceptable.
Bon par contre si on a du bidirectionnel, faudra faire évoluer ce code, sinon on aura des choses style: حاطه : -0.477121254719662
A+, Message édité par gilou le 25-05-2017 à 21:33:19 ---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --
|