tongrams-rs : berton -ton n -gram dalam karat Ini adalah port karat tongrams untuk mengindeks dan meminta model bahasa besar dalam ruang terkompresi, di mana struktur data disajikan dalam makalah berikut:
Giulio Ermanno Pibiri dan Rossano Venturini, struktur data yang efisien untuk kumpulan data N-gram besar-besaran. Dalam Prosiding Konferensi ACM ke-40 tentang Penelitian dan Pengembangan dalam Pengambilan Informasi (SIGIR 2017) , hlm. 615-624.
Giulio Ermanno Pibiri dan Rossano Venturini, menangani kumpulan data N-gram yang masif secara efisien. Transaksi ACM pada Sistem Informasi (TOIS) , 37.2 (2019): 1-41.
Simpan model bahasa n -gram dengan jumlah frekuensi.
Cari n -gram untuk mendapatkan jumlah frekuensi.
Model Bahasa Terkompresi. tongrams-rs dapat menyimpan model bahasa N -gram besar di ruang yang sangat terkompresi. Misalnya, kata dataset N -gram ( n = 1..5) di test_data disimpan hanya dalam 2,6 byte per gram.
Efisiensi waktu dan memori. tongrams-rs mempekerjakan Elias-Fano Trie , yang dengan cerdik mengkodekan struktur data trie yang terdiri dari n -gram melalui kode Elias-Fano , memungkinkan pencarian cepat dalam ruang terkompresi.
Karat murni. tongrams-rs hanya ditulis dalam karat dan dapat dengan mudah dicolokkan ke dalam kode karat Anda.
Format file n -gram menghitung file sama dengan yang digunakan di tongrams , format google yang dimodifikasi, di mana
<number_of_grams> menunjukkan jumlah n -gram dalam file,<gram> dipanta oleh ruang (misalnya, the same time ), dan<gram> dan Count <count> dipantau oleh tab horizontal. <number_of_grams>
<gram1><TAB><count1>
<gram2><TAB><count2>
<gram3><TAB><count3>
...
Misalnya,
61516
the // parent 1
the function is 22
the function a 4
the function to 1
the function and 1
...
tools menyediakan beberapa alat baris perintah untuk menikmati perpustakaan ini. Berikut ini, contoh penggunaan disajikan menggunakan file n -gram di test_data yang disalin dari tongrams .
Untuk membangun indeks trie, Anda perlu mengurutkan file n -gram Anda. Pertama, siapkan file penghitungan unigram diurutkan berdasarkan jumlah untuk membuat indeks yang dihasilkan lebih kecil, seperti
$ cat test_data/1-grams.sorted
8761
the 3681
is 1869
a 1778
of 1672
to 1638
and 1202
...
Dengan menggunakan file unigram sebagai kosakata, sort_grams yang dapat dieksekusi mengurutkan file penghitungan n -gram.
Di sini, kami menyortir file penghitungan bigram yang tidak disortir, sebagai
$ cat test_data/2-grams
38900
ways than 1
may come 1
frequent causes 1
way has 1
in which 14
...
Anda dapat mengurutkan file bigram (dalam format GZIP) dan tulis test_data/2-grams.sorted dengan perintah berikut:
$ 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"
Format file output dapat ditentukan dengan -f , dan pengaturan default adalah .gz . File yang dihasilkan akan
$ cat test_data/2-grams.sorted
38900
the // 1
the function 94
the if 3
the code 126
the compiler 117
...
index yang dapat dieksekusi membangun model bahasa dari (diurutkan) n -gram menghitung file, bernama <order>-grams.sorted.gz , dan menulisnya ke dalam file biner. Format file input dapat ditentukan dengan -f , dan pengaturan default adalah .gz .
Misalnya, perintah berikut membangun model bahasa dari n -gram menghitung file ( n = 1..5) ditempatkan di direktori test_data dan menulisnya ke 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
Seperti yang ditunjukkan output standar, file model hanya membutuhkan 2,6 byte per gram.
lookup yang dapat dieksekusi menyediakan demo untuk mencari n -gram, sebagai berikut.
$ 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!
stats yang dapat dieksekusi menunjukkan kerusakan penggunaan memori untuk setiap komponen.
$ 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}}
Di bench Direktori, Anda dapat mengukur waktu pencarian menggunakan data n -gram di test_data dengan perintah berikut:
$ RUSTFLAGS="-C target-cpu=native" cargo bench
count_lookup/tongrams/EliasFanoTrieCountLm
time: [3.1818 ms 3.1867 ms 3.1936 ms]
Waktu yang dilaporkan adalah total waktu yang berlalu untuk mencari gram acak 5K. Hasil di atas sebenarnya diperoleh pada PC laptop saya (Intel I7, 16GB RAM), yaitu, EliasFanoTrieCountLm dapat mencari gram dalam 0,64 mikro detik rata -rata.
sucds::EliasFano lebih cepat Perpustakaan ini adalah perangkat lunak gratis yang disediakan di bawah MIT.