tongrams-rs : طن من n -grams في الصدأ هذا هو منفذ الصدأ من tongrams لفهرسة والاستعلام عن نماذج لغة كبيرة في مساحة مضغوطة ، حيث يتم عرض هياكل البيانات في الأوراق التالية:
Giulio Ermanno Pibiri و Rossano Venturini ، هياكل بيانات فعالة لمجموعات بيانات N-Gram ضخمة. في وقائع مؤتمر ACM 40 حول البحث والتطوير في استرجاع المعلومات (Sigir 2017) ، الصفحات 615-624.
Giulio Ermanno Pibiri و Rossano Venturini ، يتعاملون مع مجموعات بيانات N-Gram الضخمة بكفاءة. معاملات ACM على أنظمة المعلومات (TOIS) ، 37.2 (2019): 1-41.
تخزين نماذج اللغة n -gram مع عدد الترددات.
ابحث عن n -grams للحصول على عدد الترددات.
نموذج لغة مضغوط. يمكن لـ tongrams-rs تخزين نماذج لغة N -gram الكبيرة في مساحة مضغوطة للغاية. على سبيل المثال ، يتم تخزين كلمة بيانات كلمة n -gram ( ن = 1..5) في test_data في 2.6 بايت فقط لكل غرام.
الوقت وكفاءة الذاكرة. توظف tongrams-rs Elias-Fano Trie ، التي تشفر بذكاء بنية بيانات trie تتكون من n -grams من خلال رموز Elias-Fano ، مما يتيح البحث السريع في مساحة مضغوطة.
الصدأ النقي. تتم كتابة tongrams-rs فقط في الصدأ ويمكن توصيلها بسهولة في رموز الصدأ.
إن تنسيق ملفات ملفات N -gram هو نفسه المستخدم في tongrams ، وهو تنسيق Google المعدل ، حيث
<number_of_grams> إلى عدد n -grams في الملف ،<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 -gram Counts في test_data من tongrams .
لإنشاء فهرس Trie ، تحتاج إلى فرز ملفات N -gram Counts. أولاً ، قم بإعداد ملفات 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 Counts.
هنا ، نقوم بفرز ملف تعداد 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 -gram ، المسماة <order>-grams.sorted.gz ، ويكتبه في ملف ثنائي. يمكن تحديد تنسيق ملف الإدخال باستخدام -f ، والإعداد الافتراضي هو .gz .
على سبيل المثال ، يقوم الأمر التالي بإنشاء نموذج لغة من ملفات N -gram Counts ( 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 -grams ، على النحو التالي.
$ 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 -gram في test_data مع الأمر التالي:
$ RUSTFLAGS="-C target-cpu=native" cargo bench
count_lookup/tongrams/EliasFanoTrieCountLm
time: [3.1818 ms 3.1867 ms 3.1936 ms]
الوقت الذي تم الإبلاغ عنه هو إجمالي الوقت المنقضي للبحث عن جرام عشوائي 5K. تم الحصول على النتيجة أعلاه بالفعل على جهاز الكمبيوتر المحمول الخاص بي (Intel I7 ، RAM 16GB) ، أي EliasFanoTrieCountLm يمكن أن يبحث عن غرام في 0.64 MICRO SEC في المتوسط.
sucds::EliasFano أسرع هذه المكتبة هي برنامج مجاني متوفر تحت معهد ماساتشوستس للتكنولوجيا.