tongrams-rs : Tonnen N -Gramme in Rost Dies ist ein Rostport von tongrams , um Großsprachenmodelle im komprimierten Raum zu indizieren und abzufragen, in dem die Datenstrukturen in den folgenden Arbeiten dargestellt werden:
Giulio Ermanno Pibiri und Rossano Venturini, effiziente Datenstrukturen für massive N-Gramm-Datensätze. In Proceedings der 40. ACM-Konferenz über Forschung und Entwicklung im Informationsabruf (Sigir 2017) , S. 615-624.
Giulio Ermanno Pibiri und Rossano Venturini, die massive N-Gramm-Datensätze effizient umgehen. ACM-Transaktionen zu Informationssystemen (TOIS) , 37,2 (2019): 1-41.
Speichern Sie N -Gram -Sprachmodelle mit Frequenzzahlen.
Schauen Sie nach N -Grams nach, um die Frequenzzahlen zu erhalten.
Komprimiertes Sprachmodell. tongrams-rs können große N -Gram -Sprachmodelle im sehr komprimierten Raum speichern. Beispielsweise werden die Datensätze mit n -Gram ( n = 1..5) in test_data in nur 2,6 Bytes pro Gramm gespeichert.
Zeit- und Speicher -Effizienz. tongrams-rs verwendet Elias-Fano-Trie , das eine Trie-Datenstruktur, die aus N -Grams besteht, durch Elias-Fano-Codes codiert und schnelle Lookups im komprimierten Raum ermöglicht.
Reiner Rost. tongrams-rs ist nur in Rost geschrieben und kann leicht in Ihre Rostcodes eingestuft werden.
Das Dateiformat von n -Gram zählt Dateien mit dem in tongrams verwendeten, einem geänderten Google -Format, wo
<number_of_grams> zeigt die Anzahl der n -Grams in der Datei an.<gram> werden durch einen Raum ( the same time .<gram> und die Graf <count> werden durch eine horizontale Registerkarte ausgesparert. <number_of_grams>
<gram1><TAB><count1>
<gram2><TAB><count2>
<gram3><TAB><count3>
...
Zum Beispiel,
61516
the // parent 1
the function is 22
the function a 4
the function to 1
the function and 1
...
tools bietet einige Befehlszeilen -Tools, um diese Bibliothek zu genießen. Im Folgenden werden die Beispielnutzungen mit n -Gram -Zähldateien in test_data aus tongrams dargestellt.
Um den Trie -Index zu erstellen, müssen Sie Ihre n -Gram -Zähldateien sortieren. Erstellen Sie zunächst die von den Zählungen sortierten Unigram -Zählungsdateien, um einen resultierenden Index kleiner zu machen, wie
$ cat test_data/1-grams.sorted
8761
the 3681
is 1869
a 1778
of 1672
to 1638
and 1202
...
Durch die Verwendung der UNIGRAM -Datei als Wortschatz sortiert die ausführbare sort_grams eine n -Gram -Datei.
Hier sortieren wir eine unsortierte Bigram Counts -Datei wie
$ cat test_data/2-grams
38900
ways than 1
may come 1
frequent causes 1
way has 1
in which 14
...
Sie können die BigRam-Datei (in einem GZIP-Format) sortieren und test_data/2-grams.sorted schreiben. Sorted mit dem folgenden Befehl:
$ 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"
Das Ausgabedateiformat kann mit -f angegeben werden und die Standardeinstellung ist .gz . Die resultierende Datei wird sein
$ cat test_data/2-grams.sorted
38900
the // 1
the function 94
the if 3
the code 126
the compiler 117
...
Der ausführbare index erstellt ein Sprachmodell aus (sortiert) n -Gram -Dateien, die mit dem Namen <order>-grams.sorted.gz bezeichnet werden, und schreibt es in eine Binärdatei. Das Eingabedateiformat kann mit -f angegeben werden und die Standardeinstellung ist .gz .
Der folgende Befehl erstellt beispielsweise ein Sprachmodell aus n -Gram -Dateien ( n = 1..5), das in Verzeichnis test_data platziert ist, und schreibt es in 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
Wie die Standardausgabe zeigt, dauert die Modelldatei nur 2,6 Bytes pro Gramm.
Die ausführbare lookup bietet eine Demo für die Suche nach N -Grams wie folgt.
$ 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!
Die ausführbaren stats zeigen die Aufschlüsse der Speicherverwendungen für jede Komponente.
$ 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}}
Auf der bench können Sie die Suchzeiten mit den n -Gram -Daten in test_data mit dem folgenden Befehl messen:
$ RUSTFLAGS="-C target-cpu=native" cargo bench
count_lookup/tongrams/EliasFanoTrieCountLm
time: [3.1818 ms 3.1867 ms 3.1936 ms]
Die gemeldete Zeit ist die gesamte verstrichene Zeit, um 5 -km -Zufallsgramm nachzuschlagen. Das obige Ergebnis wurde tatsächlich auf meinem Laptop -PC (Intel i7, 16 GB RAM) erzielt, dh EliasFanoTrieCountLm kann im Durchschnitt in 0,64 Mikro -SEC einen Gramm nachschlagen.
sucds::EliasFano schneller Diese Bibliothek ist eine kostenlose Software, die unter MIT bereitgestellt wird.