tongrams-rs : des tonnes de n -grammes en rouille Il s'agit d'un port de rouille des tongrams pour indexer et interroger les modèles de grands langues dans l'espace comprimé, dans lequel les structures de données sont présentées dans les articles suivants:
Giulio Ermanno Pibiri et Rossano Venturini, Structures de données efficaces pour les ensembles de données N-Gram massifs. Dans Actes de la 40e conférence ACM sur la recherche et le développement dans la récupération de l'information (Sigir 2017) , pp. 615-624.
Giulio Ermanno Pibiri et Rossano Venturini, gérant efficacement les ensembles de données N-gramm massifs. ACM Transactions on Information Systems (TOIS) , 37.2 (2019): 1-41.
Stockez les modèles de langage n -gram avec des dénombrements de fréquences.
Recherchez les n -grammes pour obtenir le nombre de fréquences.
Modèle de langage comprimé. tongrams-rs peut stocker de grands modèles de langage N -Gram dans un espace très comprimé. Par exemple, les ensembles de données N -gram Word ( n = 1..5) dans test_data sont stockés en seulement 2,6 octets par gramme.
Temps et efficacité de la mémoire. tongrams-rs utilise Elias-Fano Trie , qui code intelligemment d'une structure de données TRIE composée de n -grammes via des codes Elias-Fano , permettant des recherches rapides dans l'espace comprimé.
Rouille pure. tongrams-rs est écrit uniquement en rouille et peut être facilement branché sur vos codes de rouille.
Le format de fichier des fichiers N -Gram Count est le même que celui utilisé dans tongrams , un format Google modifié, où
<number_of_grams> indique le nombre de n -grams dans le fichier,<gram> sont effrayés par un espace (par exemple, the same time ), et<gram> et le nombre <count> sont entravés par une onglet horizontale. <number_of_grams>
<gram1><TAB><count1>
<gram2><TAB><count2>
<gram3><TAB><count3>
...
Par exemple,
61516
the // parent 1
the function is 22
the function a 4
the function to 1
the function and 1
...
tools fournit des outils de ligne de commande pour profiter de cette bibliothèque. Dans ce qui suit, les usages d'exemples sont présentés à l'aide de fichiers N -Gram dans test_data copiés à partir de tongrams .
Pour créer l'index Trie, vous devez trier vos fichiers N -Gram Counts. Premièrement, préparer les fichiers de nombre d'unigrammes triés par les dénombrements pour rendre un index résultant plus petit, comme
$ cat test_data/1-grams.sorted
8761
the 3681
is 1869
a 1778
of 1672
to 1638
and 1202
...
En utilisant le fichier Unigram comme vocabulaire, l'exécutable sort_grams trie un fichier N -gram Counts.
Ici, nous trierons un fichier Bigram Counts non trié, comme
$ cat test_data/2-grams
38900
ways than 1
may come 1
frequent causes 1
way has 1
in which 14
...
Vous pouvez trier le fichier bigram (dans un format GZIP) et écrire test_data/2-grams.sorted Sorte avec la commande suivante:
$ cargo run --release -p tools --bin sort_grams -- -i test_data/2-grams.gz -v test_data/1-grams.sorted.gz -o test_data/2-grams.sorted
Loading the vocabulary: "test_data/1-grams.sorted.gz"
Loading the records: "test_data/2-grams.gz"
Sorting the records
Writing the index into "test_data/2-grams.sorted.gz"
Le format de fichier de sortie peut être spécifié avec -f et le paramètre par défaut est .gz . Le fichier résultant sera
$ cat test_data/2-grams.sorted
38900
the // 1
the function 94
the if 3
the code 126
the compiler 117
...
L' index exécutable construit un modèle linguistique à partir de fichiers (triés) n -gram, nommé <order>-grams.sorted.gz , et l'écrit dans un fichier binaire. Le format de fichier d'entrée peut être spécifié avec -f et le paramètre par défaut est .gz .
Par exemple, la commande suivante construit un modèle de langue à partir de fichiers N -gram Count ( n = 1..5) placés dans le répertoire test_data et l'écrit dans index.bin .
$ cargo run --release -p tools --bin index -- -n 5 -i test_data -o index.bin
Input files: ["test_data/1-grams.sorted.gz", "test_data/2-grams.sorted.gz", "test_data/3-grams.sorted.gz", "test_data/4-grams.sorted.gz", "test_data/5-grams.sorted.gz"]
Counstructing the index...
Elapsed time: 0.190 [sec]
252550 grams are stored.
Writing the index into "index.bin"...
Index size: 659366 bytes (0.629 MiB)
Bytes per gram: 2.611 bytes
Comme le montre la sortie standard, le fichier modèle ne prend que 2,6 octets par gramme.
La lookup exécutable fournit une démo à la recherche de n -grammes, comme suit.
$ cargo run --release -p tools --bin lookup -- -i index.bin
Loading the index from "index.bin"...
Performing the lookup...
> take advantage
count = 8
> only 64-bit execution
count = 1
> Elias Fano
Not found
>
Good bye!
Les stats exécutables affichent les ventilations d'utilisation de la mémoire pour chaque composant.
$ cargo run --release -p tools --bin stats -- -i index.bin
Loading the index from "index.bin"...
{"arrays":[{"pointers":5927,"token_ids":55186},{"pointers":19745,"token_ids":92416},{"pointers":25853,"token_ids":107094},{"pointers":28135,"token_ids":111994}],"count_ranks":[{"count_ranks":5350},{"count_ranks":12106},{"count_ranks":13976},{"count_ranks":14582},{"count_ranks":14802}],"counts":[{"count":296},{"count":136},{"count":72},{"count":56},{"count":56}],"vocab":{"data":151560}}
Au bench d'annuaire, vous pouvez mesurer les temps de recherche en utilisant les données N -gram dans test_data avec la commande suivante:
$ RUSTFLAGS="-C target-cpu=native" cargo bench
count_lookup/tongrams/EliasFanoTrieCountLm
time: [3.1818 ms 3.1867 ms 3.1936 ms]
Le temps rapporté est le temps total écoulé pour rechercher des grammes aléatoires de 5k. Le résultat ci-dessus a été obtenu sur mon ordinateur portable PC (Intel i7, 16 Go de RAM), c'est-à-dire, EliasFanoTrieCountLm peut rechercher un gramme en 0,64 micro Sec en moyenne.
sucds::EliasFano plus vite Cette bibliothèque est un logiciel libre fourni dans le MIT.