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 ขนาดใหญ่ในพื้นที่บีบอัดได้ ตัวอย่างเช่นชุดข้อมูล Word N -Gram ( n = 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 นับใน test_data คัดลอกจาก tongrams
ในการสร้างดัชนี Trie คุณต้องเรียงลำดับไฟล์ N -Gram นับ ก่อนอื่นให้เตรียมไฟล์ Unigram นับจำนวน
$ 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 ที่ไม่ได้เรียงลำดับเป็น AS
$ 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 นับไฟล์ ( n = 1..5) วางไว้ในไดเรกทอรี 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 Directory คุณสามารถวัดเวลาค้นหาโดยใช้ข้อมูล 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, 16GB RAM), IE, EliasFanoTrieCountLm สามารถค้นหากรัมใน 0.64 ไมโครวินาทีโดยเฉลี่ย
sucds::EliasFano เร็วขึ้น ห้องสมุดนี้เป็นซอฟต์แวร์ฟรีที่ให้ไว้ภายใต้ MIT