tongrams-rs : тонны n -граммов в ржавчине Это порт ржавчины tongrams для индекса и запроса больших языковых моделей в сжатом пространстве, в котором структуры данных представлены в следующих документах:
Джулио Эрманно Пибири и Россано Вентурини, Эффективные структуры данных для массивных наборов данных N-GRAM. В материалах 40-й конференции ACM по исследованиям и разработкам в поисках информации (Sigir 2017) , стр. 615-624.
Джулио Эрманно Пибири и Россано Вентурини, эффективно обрабатывая массовые наборы N-граммы. Транзакции ACM по информационным системам (TOIS) , 37.2 (2019): 1-41.
Храните n -граммы языковых моделей с частотным подсчетом.
Посмотрите N -Grams, чтобы получить количество частот.
Модель сжатого языка. tongrams-rs могут хранить большие языковые модели N -граммы в очень сжатом пространстве. Например, наборы данных n -Gram ( n = 1..5) в test_data хранятся всего за 2,6 байта на грамм.
Время и эффективность памяти. tongrams-rs используется Elias-Fano Trie , который умно кодирует структуру данных Trie, состоящую из n -граммов через коды Elias-Fano , что позволяет быстрый поиск в сжатом пространстве.
Чистая ржавчина. tongrams-rs написан только в ржавчине и его можно легко подключить к кодам ржавчины.
Формат файла файлов n -граммы такой же, как и в tongrams , измененный формат Google, где
<number_of_grams> указывает количество n -граммов в файле,<gram> выставлены в пространство (например, the same time ) и<gram> и граф <count> выставлены горизонтальной вкладкой. <number_of_grams>
<gram1><TAB><count1>
<gram2><TAB><count2>
<gram3><TAB><count3>
...
Например,
61516
the // parent 1
the function is 22
the function a 4
the function to 1
the function and 1
...
tools предоставляют некоторые инструменты командной строки для наслаждения этой библиотекой. Далее, пример использования представлены с использованием файлов n -граммы в test_data , скопированных из tongrams .
Чтобы построить индекс TRIE, вам необходимо сортировать файлы N -Gram. Во -первых, подготовить файлы Unigram Counts, отсортированные по количеству, чтобы сделать полученный индекс меньше, как
$ cat test_data/1-grams.sorted
8761
the 3681
is 1869
a 1778
of 1672
to 1638
and 1202
...
Используя файл Unigram в качестве словарного запаса, исполняемый sort_grams сортирует файл подсчета n -gram.
Здесь мы сортируем несортированный файл подсчета Bigram, как
$ cat test_data/2-grams
38900
ways than 1
may come 1
frequent causes 1
way has 1
in which 14
...
Вы можете сортировать файл Bigram (в формате GZIP) и написать test_data/2-grams.sorted со следующей командой:
$ 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"
Формат выходного файла может быть указан с -f , а настройка по умолчанию .gz . Полученный файл будет
$ cat test_data/2-grams.sorted
38900
the // 1
the function 94
the if 3
the code 126
the compiler 117
...
Исполняемая index создает языковую модель из (отсортированных) N -Грамских Файл, с именем <order>-grams.sorted.gz и записывает его в двоичный файл. Формат ввода файла может быть указан с -f , а настройка по умолчанию .gz .
Например, следующая команда создает языковую модель из файлов N -Gram ( n = 1..5), помещенной в Directory test_data и записывает ее в 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
Как показывает стандартный вывод, файл модели занимает всего 2,6 байта на грамм.
Исполняемый lookup обеспечивает демо для поиска n -граммов, следующим образом.
$ 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 показаны разбивки использования памяти для каждого компонента.
$ 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}}
На bench каталогов вы можете измерить время поиска, используя данные n -граммы в test_data со следующей командой:
$ RUSTFLAGS="-C target-cpu=native" cargo bench
count_lookup/tongrams/EliasFanoTrieCountLm
time: [3.1818 ms 3.1867 ms 3.1936 ms]
Сообщаемое время - это общее время для поиска 5 тыс. Случайных граммов. Приведенный выше результат был фактически получен на моем ноутбуке (Intel I7, 16 ГБ ОЗУ), т.е. EliasFanoTrieCountLm может искать грамм в 0,64 микрос секунды в среднем.
sucds::EliasFano быстрее Эта библиотека представляет собой бесплатное программное обеспечение, предоставляемое под MIT.