Pemahaman kontekstual alternatif menggunakan model bahasa statistik

Alm

Internet penuh dengan artikel tentang model bahasa berbasis N-gram. Pada saat yang sama, ada beberapa perpustakaan yang siap bekerja.

Ada KenLM , SriLM dan IRSTLM . Mereka populer dan digunakan dalam banyak proyek besar. Tetapi ada beberapa masalah:

  1. Perpustakaan sudah tua, tidak berkembang.
  2. Dukungan yang buruk untuk bahasa Rusia.
  3. Hanya bekerja dengan teks bersih, disiapkan khusus
  4. Dukungan buruk untuk UTF-8. Sebagai contoh, SriLM dengan bendera tolower merusak encoding.

KenLM sedikit menonjol dari daftar . Ini didukung secara teratur dan tidak memiliki masalah dengan UTF-8, tetapi juga menuntut kualitas teks.

Suatu ketika saya membutuhkan perpustakaan untuk membangun model bahasa. Setelah banyak percobaan dan kesalahan, saya sampai pada kesimpulan bahwa mempersiapkan dataset untuk mengajar model bahasa terlalu rumit dan proses yang panjang. Terutama jika itu bahasa Rusia ! Tapi entah bagaimana saya ingin mengotomatiskan segalanya.

Dalam penelitiannya, ia mulai dari perpustakaan SriLM . Saya akan segera mencatat bahwa ini bukan peminjaman kode atau garpu SriLM . Semua kode ditulis sepenuhnya dari awal.

Contoh teks kecil:


         !      .

Kurangnya ruang antara kalimat adalah kesalahan ketik yang cukup umum. Kesalahan seperti itu sulit ditemukan dalam sejumlah besar data, sementara itu memecahkan tokenizer.

Setelah diproses, N-gram berikut akan muncul dalam model bahasa:


-0.3009452 !  

Tentu saja, ada banyak masalah lain, kesalahan ketik, karakter khusus, singkatan, berbagai rumus matematika ... Semua ini harus ditangani dengan benar.

APA PUN LM ( ALM )


Perpustakaan hanya mendukung Linux , MacOS X, dan FreeBSD sistem operasi . Saya tidak memiliki Windows dan tidak ada dukungan yang direncanakan.

Deskripsi singkat tentang fungsionalitas


  1. Dukungan untuk UTF-8 tanpa ketergantungan pihak ketiga.
  2. Dukungan untuk format data: Arpa, Vocab, Urutan Peta, N-gram, Binary alm dictionary.
  3. : Kneser-Nay, Modified Kneser-Nay, Witten-Bell, Additive, Good-Turing, Absolute discounting.
  4. , , , .
  5. , N-, N- , N-.
  6. — N-, .
  7. : , -.
  8. N- — N-, backoff .
  9. N- backoff-.
  10. , : , , , , Python3.
  11. « », .
  12. 〈unk〉 .
  13. N- Python3.
  14. , .
  15. . : , , .
  16. Tidak seperti model bahasa lainnya, ALM dijamin untuk mengumpulkan semua N-gram dari teks, berapa pun panjangnya (kecuali untuk Modifikasi Kneser-Nay). Ada juga kemungkinan pendaftaran wajib semua N-gram langka, bahkan jika mereka bertemu hanya 1 kali.

Dari format model bahasa standar, hanya format ARPA yang didukung . Jujur, saya tidak melihat alasan untuk mendukung seluruh kebun binatang dalam semua jenis format.

Format ARPA peka huruf besar-kecil dan ini juga merupakan masalah yang pasti.

Terkadang hanya berguna untuk mengetahui keberadaan data tertentu dalam N-gram. Misalnya, Anda perlu memahami keberadaan angka dalam N-gram, dan artinya tidak begitu penting.

Contoh:


 ,      2 

Akibatnya, N-gram masuk ke model bahasa:


-0.09521468  2 

Nomor spesifik, dalam hal ini, tidak masalah. Dijual di toko bisa 1 dan 3 dan sebanyak hari yang Anda suka.

Untuk mengatasi masalah ini, ALM menggunakan tokenization kelas.

Token yang didukung


Standar:

〈s〉 - Token dari awal kalimat
〈/s〉 - Token dari akhir kalimat
〈unk Tok - Token dari kata yang tidak diketahui

Non-standar:

〈url〉 - Token dari alamat url
〈num〉 - Token angka (Arab atau Romawi)
〈date〈 - Tanggal token (18 Juli 2004 | 18/07/2004)
〈time〉 - Token Waktu (15:44:56)
〈abbr〉 - Token Singkatan (1st | 2nd | 20th)
〉 anum〉 - Pseudo -Token numbers (T34 | 895-M-86 | 39km)
〈math〉 - Token operasi matematika (+ | - | = | / | * | ^)
〈range〉 - Token dari rentang angka (1-2 | 100-200 | 300- 400)
〈aprox〉- Sebuah token angka perkiraan (~ 93 | ~ 95.86 | 10 ~ 20)
〉score〉 - Token akun numerik (4: 3 | 01:04)
〈dimen〉 - Keseluruhan token (200x300 | 1920x1080)
〈fract〉 - A fraksi token (5/20 | 192/864)
〈punct〉 - Token karakter tanda baca (. | ... |, |! |? |: |;)
〈Specl〉 - Token karakter khusus (~ | @ | # | No. |% | & | $ | § | ±)
<isolat> - simbol Isolasi tanda ( "| '|" | "|‘|’|` | (|) | [|] | {|})

Tentu saja, dukungan untuk masing-masing token dapat dinonaktifkan jika N-gram tersebut

diperlukan. Jika Anda perlu memproses tag lain (misalnya, Anda perlu menemukan nama negara dalam teks), ALM mendukung koneksi skrip eksternal di Python3.

Contoh skrip deteksi token:


# -*- coding: utf-8 -*-

def init():
    """
     :       
    """

def run(token, word):
    """
      :      
    @token   
    @word  
    """
    if token and (token == "<usa>"):
        if word and (word.lower() == ""): return "ok"
    elif token and (token == "<russia>"):
        if word and (word.lower() == ""): return "ok"
    return "no"

Skrip semacam itu menambahkan dua tag lagi ke daftar tag standar: 〈usa〉 dan 〈russia〉 .

Selain skrip untuk mendeteksi token, ada dukungan untuk skrip untuk preprocessing kata yang diproses. Script ini dapat mengubah kata sebelum menambahkan kata ke model bahasa.

Contoh skrip pengolah kata:


# -*- coding: utf-8 -*-

def init():
    """
     :       
    """

def run(word, context):
    """
      :      
    @word  
    @context      
    """
    return word

Pendekatan semacam itu dapat berguna jika perlu untuk menyusun model bahasa yang terdiri dari lemma atau batang .

Format Model Bahasa Teks Didukung oleh ALM


ARPA:


\data\
ngram 1=52
ngram 2=68
ngram 3=15

\1-grams:
-1.807052	1-	-0.30103
-1.807052	2	-0.30103
-1.807052	3~4	-0.30103
-2.332414		-0.394770
-3.185530		-0.311249
-3.055896		-0.441649
-1.150508	</s>
-99	<s>	-0.3309932
-2.112406	<unk>
-1.807052	T358	-0.30103
-1.807052	VII	-0.30103
-1.503878		-0.39794
-1.807052		-0.30103
-1.62953		-0.30103
...

\2-grams:
-0.29431	1- 
-0.29431	2 
-0.29431	3~4 
-0.8407791	<s> 
-1.328447	 	-0.477121
...

\3-grams:
-0.09521468	  
-0.166590	  
...

\end\

ARPA adalah format teks standar untuk model bahasa bahasa alami yang digunakan oleh Sphinx / CMU dan Kaldi .
FrekuensiN gramMembalikkan frekuensi
-1.328447setelah itu-0.477121

NGRAM:


\data\
ad=1
cw=23832
unq=9390

ngram 1=9905
ngram 2=21907
ngram 3=306

\1-grams:
<s>	2022 | 1
<num>	117 | 1
<unk>	19 | 1
<abbr>	16 | 1
<range>	7 | 1
</s>	2022 | 1
	244 | 1
	244 | 1
	11 | 1
	762 | 1
	112 | 1
	224 | 1
	1 | 1
	86 | 1
	978 | 1
	396 | 1
	108 | 1
	77 | 1
	32 | 1
...

\2-grams:
<s> <num>	7 | 1
<s> <unk>	1 | 1
<s> 	84 | 1
<s> 	83 | 1
<s> 	57 | 1
 	82 | 1
 	11 | 1
 	24 | 1
 	18 | 1
 	31 | 1
 	45 | 1
 	97 | 1
 	71 | 1
...

\3-grams:
<s> <num> </s>	3 | 1
<s>  	6 | 1
<s>  	4 | 1
<s>  	2 | 1
<s>  	3 | 1
  	2 | 1
  </s>	2 | 1
  	2 | 1
  	2 | 1
  	2 | 1
  	2 | 1
  	2 | 1
  </s>	2 | 1
  </s>	3 | 1
  	2 | 1
...

\end\

Ngrams - format teks non-standar dari model bahasa, adalah modifikasi dari format ARPA .
N gramKejadian KasusKejadian Dokumen
hanya dalam satu21

Deskripsi:

  • ad  - Jumlah dokumen dalam enklosur
  • cw  - Jumlah kata dalam semua dokumen dalam korpus
  • unq  - Jumlah kata unik yang dikumpulkan

KOSA KATA:


\data\
ad=1
cw=23832
unq=9390

\words:
33		244 | 1 | 0.010238 | 0.000000 | -3.581616
34		11 | 1 | 0.000462 | 0.000000 | -6.680889
35		762 | 1 | 0.031974 | 0.000000 | -2.442838
40		12 | 1 | 0.000504 | 0.000000 | -6.593878
330344		47 | 1 | 0.001972 | 0.000000 | -5.228637
335190		17 | 1 | 0.000713 | 0.000000 | -6.245571
335192		1 | 1 | 0.000042 | 0.000000 | -9.078785
335202		22 | 1 | 0.000923 | 0.000000 | -5.987742
335206		7 | 1 | 0.000294 | 0.000000 | -7.132874
335207		29 | 1 | 0.001217 | 0.000000 | -5.711489
2282019644		1 | 1 | 0.000042 | 0.000000 | -9.078785
2282345502		10 | 1 | 0.000420 | 0.000000 | -6.776199
2282416889		2 | 1 | 0.000084 | 0.000000 | -8.385637
3009239976		1 | 1 | 0.000042 | 0.000000 | -9.078785
3009763109		1 | 1 | 0.000042 | 0.000000 | -9.078785
3013240091		1 | 1 | 0.000042 | 0.000000 | -9.078785
3014009989		1 | 1 | 0.000042 | 0.000000 | -9.078785
3015727462		2 | 1 | 0.000084 | 0.000000 | -8.385637
3025113549		1 | 1 | 0.000042 | 0.000000 | -9.078785
3049820849		1 | 1 | 0.000042 | 0.000000 | -9.078785
3061388599		1 | 1 | 0.000042 | 0.000000 | -9.078785
3063804798		1 | 1 | 0.000042 | 0.000000 | -9.078785
3071212736		1 | 1 | 0.000042 | 0.000000 | -9.078785
3074971025		1 | 1 | 0.000042 | 0.000000 | -9.078785
3075044360		1 | 1 | 0.000042 | 0.000000 | -9.078785
3123271427		1 | 1 | 0.000042 | 0.000000 | -9.078785
3123322362		1 | 1 | 0.000042 | 0.000000 | -9.078785
3126399411		1 | 1 | 0.000042 | 0.000000 | -9.078785

Vocab adalah format kamus teks yang tidak standar dalam model bahasa.
ID kataKataKejadian KasusKejadian Dokumentftf-idfwltf
2282345502baru1010,0004200,000000-6.776199

Deskripsi:

  • oc  - kemunculan kasus
  • dc  - kemunculan dalam dokumen
  • tf - (term frequency — ) — . , , : [tf = oc / cw]
  • idf - (inverse document frequency — ) — , , : [idf = log(ad / dc)]
  • tf-idf - : [tf-idf = tf * idf]
  • wltf - , : [wltf = 1 + log(tf * dc)]

MAP:


1:{2022,1,0}|42:{57,1,0}|279603:{2,1,0}
1:{2022,1,0}|42:{57,1,0}|320749:{2,1,0}
1:{2022,1,0}|42:{57,1,0}|351283:{2,1,0}
1:{2022,1,0}|42:{57,1,0}|379815:{3,1,0}
1:{2022,1,0}|42:{57,1,0}|26122748:{3,1,0}
1:{2022,1,0}|44:{6,1,0}
1:{2022,1,0}|48:{1,1,0}
1:{2022,1,0}|51:{11,1,0}|335967:{3,1,0}
1:{2022,1,0}|53:{14,1,0}|371327:{3,1,0}
1:{2022,1,0}|53:{14,1,0}|40260976:{7,1,0}
1:{2022,1,0}|65:{68,1,0}|34:{2,1,0}
1:{2022,1,0}|65:{68,1,0}|3277:{3,1,0}
1:{2022,1,0}|65:{68,1,0}|278003:{2,1,0}
1:{2022,1,0}|65:{68,1,0}|320749:{2,1,0}
1:{2022,1,0}|65:{68,1,0}|11353430797:{2,1,0}
1:{2022,1,0}|65:{68,1,0}|34270133320:{2,1,0}
1:{2022,1,0}|65:{68,1,0}|51652356484:{2,1,0}
1:{2022,1,0}|65:{68,1,0}|66967237546:{2,1,0}
1:{2022,1,0}|2842:{11,1,0}|42:{7,1,0}

Peta - isi file, memiliki makna teknis murni. Digunakan bersama dengan file vocab , Anda dapat menggabungkan beberapa model bahasa, memodifikasi, menyimpan, mendistribusikan, dan mengekspor ke format apa pun ( arpa , ngrams , binary alm ).

Format File Teks Helper Didukung oleh ALM


Seringkali, ketika menyusun model bahasa, kesalahan ketik muncul dalam teks, yang menggantikan huruf (dengan huruf alfabet lain yang serupa secara visual).

ALM memecahkan masalah ini dengan file dengan huruf yang mirip.

p  
c  
o  
t  
k  
e  
a  
h  
x  
b  
m  

Surat yang dicariPembatasSurat pengganti
t\ tt

Jika, ketika mengajar model bahasa, mentransfer file dengan daftar domain dan singkatan tingkat pertama, maka ALM dapat membantu dengan deteksi yang lebih akurat untuk tag kelas 〈url〉 dan 〈abbr〉 .

File Daftar Singkatan:











File Daftar Zona Domain:


ru
su
cc
net
com
org
info

Untuk mendeteksi token 〈url〉 yang lebih akurat , Anda harus menambahkan zona domain tingkat pertama Anda (semua zona domain dari contoh sudah diinstal sebelumnya) .

Wadah biner dari model bahasa ALM


Untuk membangun wadah biner untuk model bahasa, Anda perlu membuat file JSON dengan deskripsi parameter Anda.

Opsi JSON:


{
	"aes": 128,
	"name": "Name dictionary",
	"author": "Name author",
	"lictype": "License type",
	"lictext": "License text",
	"contacts": "Contacts data",
	"password": "Password if needed",
	"copyright": "Copyright author"
}

Deskripsi:

  • aes - ukuran enkripsi AES (128, 192, 256) bit
  • nama - nama Kamus
  • penulis - penulis kamus
  • lictype - Jenis lisensi
  • lictext - Teks lisensi
  • kontak - Penulis detail kontak
  • kata sandi - Kata sandi enkripsi (jika diperlukan), enkripsi dilakukan hanya ketika mengatur kata sandi
  • hak cipta - Hak cipta dari pemilik kamus

Semua parameter bersifat opsional kecuali nama wadah.

Contoh Perpustakaan ALM


Operasi Tokenizer


Tokenizer menerima teks pada input, dan menghasilkan JSON pada output.

$ echo 'Hello World?' | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method tokens

terminal

Uji:

Hello World?

Hasil:

[
	["Hello","World","?"]
]

Mari kita coba sesuatu yang lebih sulit ...

$ echo '         ???      ....' | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method tokens

terminal

Uji:

         ???      ....

Hasil:

[
	[
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"?",
		"?",
		"?"
],[
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		".",
		".",
		".",
		"."
	]
]

Seperti yang Anda lihat, tokenizer bekerja dengan benar dan memperbaiki kesalahan dasar.
Ubah sedikit teks dan lihat hasilnya.

$ echo '         ...      .' | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method tokens

terminal

Uji:

         ...      .

Hasil:

[
	[
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		".",
		".",
		".",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"."
	]
]

Seperti yang Anda lihat, hasilnya telah berubah. Sekarang coba yang lain.

$ echo '    5–7 .             : 1 .   ( +37–38°),  5–10 . –   ( +12–15°)  ..»| |()' | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method tokens

terminal

Uji:

    5–7 .             : 1 .   ( +37–38°),  5–10 . –   ( +12–15°)  ..»| |()

Hasil:

[
	[
		"",
		"",
		"",
		"",
		"5–7",
		".",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		"",
		":",
		"1",
		".",
		"",
		"",
		"(",
		"+37–38°",
		")",
		",",
		"",
		"5–10",
		".",
		"–",
		"",
		"",
		"(",
		"+12–15°",
		")",
		"",
		"..",
		"»",
		"|",
		"|",
		"(",
		")"
	]
]

Gabungkan semuanya kembali menjadi teks


Pertama, kembalikan tes pertama.

$ echo '[["Hello","World","?"]]' | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method tokens

terminal

Uji:

[["Hello","World","?"]]

Hasil:

Hello World?

Kami sekarang akan mengembalikan tes yang lebih kompleks.

$ echo '[["","","","","","","","","","","?","?","?"],["","","","","","","",".",".",".","."]]' | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method tokens

terminal

Uji:

[["","","","","","","","","","","?","?","?"],["","","","","","","",".",".",".","."]]

Hasil:

         ???
      ….

Seperti yang Anda lihat, tokenizer dapat mengembalikan teks yang awalnya rusak.

Lanjutkan.

$ echo '[["","","","","","","","","","",".",".",".","","","","","","","","."]]' | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method tokens

terminal

Uji:

[["","","","","","","","","","",".",".",".","","","","","","","","."]]

Hasil:

         ...       .

Dan akhirnya, periksa opsi yang paling sulit.

$ echo '[["","","","","5–7",".","","","","","","","","","","","","","",":","1",".","","","(","+37–38°",")",",","","5–10",".","–","","","(","+12–15°",")","","..","»","|","|","(",")"]]' | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method tokens

terminal

Uji:

[["","","","","5–7",".","","","","","","","","","","","","","",":","1",".","","","(","+37–38°",")",",","","5–10",".","–","","","(","+12–15°",")","","..","»","|","|","(",")"]]

Hasil:

    5–7 .             : 1 .   (+37–38°),  5–10 . –   (+12–15°)  ..» || ()

Seperti dapat dilihat dari hasil, tokenizer dapat memperbaiki sebagian besar kesalahan dalam desain teks.

Pelatihan model bahasa


$ ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -size 3 -smoothing wittenbell -method train -debug 1 -w-arpa ./lm.arpa -w-map ./lm.map -w-vocab ./lm.vocab -w-ngram ./lm.ngrams -allow-unk -interpolate -corpus ./text.txt -threads 0 -train-segments

Saya akan menjelaskan parameter perakitan secara lebih rinci.

  • size - Ukuran panjang N-gram (ukuran diatur ke 3 gram )
  • smoothing - Smoothing algorithm (algoritma dipilih oleh Witten-Bell )
  • metode - Metode kerja (metode pelatihan yang ditentukan )
  • debug - Mode debug (indikator status pembelajaran diatur)
  • w-arpaARPA
  • w-mapMAP
  • w-vocabVOCAB
  • w-ngramNGRAM
  • allow-unk〈unk〉
  • interpolate
  • corpus — . ,
  • utas - Gunakan multithreading untuk pelatihan (0 - untuk pelatihan, semua inti prosesor yang tersedia akan diberikan,> 0 jumlah inti yang berpartisipasi dalam pelatihan)
  • train-segment - Gedung pelatihan akan disegmentasikan secara merata di semua inti

Informasi lebih lanjut dapat diperoleh dengan menggunakan flag [-help] .

terminal

Perhitungan kebingungan


$ echo "         ???      ...." | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method ppl -debug 2 -r-arpa ./lm.arpa -confidence -threads 0

terminal

Uji:

         ???      ….

Hasil:

info: <s>           <punct> <punct> <punct> </s>

info: p(  | <s> ) = [2gram] 0.00209192 [ -2.67945500 ] / 0.99999999
info: p(  |  ...) = [3gram] 0.91439744 [ -0.03886500 ] / 1.00000035
info: p(  |  ...) = [3gram] 0.86302624 [ -0.06397600 ] / 0.99999998
info: p(  |  ...) = [3gram] 0.98003368 [ -0.00875900 ] / 1.00000088
info: p(  |  ...) = [3gram] 0.85783547 [ -0.06659600 ] / 0.99999955
info: p(  |  ...) = [3gram] 0.95238819 [ -0.02118600 ] / 0.99999897
info: p(  |  ...) = [3gram] 0.97959599 [ -0.00895300 ] / 1.00000090
info: p(  |  ...) = [3gram] 0.97959599 [ -0.00895300 ] / 1.00000090
info: p(  |  ...) = [3gram] 0.97959599 [ -0.00895300 ] / 1.00000090
info: p(  |  ...) = [3gram] 0.97959599 [ -0.00895300 ] / 1.00000090
info: p( <punct> |  ...) = [3gram] 0.78127873 [ -0.10719400 ] / 1.00000031
info: p( <punct> | <punct> ...) = [2gram] 0.29417110 [ -0.53140000 ] / 0.99999998
info: p( <punct> | <punct> ...) = [3gram] 0.51262054 [ -0.29020400 ] / 0.99999998
info: p( </s> | <punct> ...) = [3gram] 0.45569787 [ -0.34132300 ] / 0.99999998

info: 1 sentences, 13 words, 0 OOVs
info: 0 zeroprobs, logprob= -4.18477000 ppl= 1.99027067 ppl1= 2.09848266

info: <s>        <punct> <punct> <punct> <punct> </s>

info: p(  | <s> ) = [2gram] 0.00809597 [ -2.09173100 ] / 0.99999999
info: p(  |  ...) = [3gram] 0.19675329 [ -0.70607800 ] / 0.99999972
info: p(  |  ...) = [3gram] 0.97959599 [ -0.00895300 ] / 1.00000090
info: p(  |  ...) = [3gram] 0.98007204 [ -0.00874200 ] / 0.99999931
info: p(  |  ...) = [3gram] 0.85785325 [ -0.06658700 ] / 1.00000018
info: p(  |  ...) = [3gram] 0.81482810 [ -0.08893400 ] / 1.00000027
info: p(  |  ...) = [3gram] 0.93507404 [ -0.02915400 ] / 1.00000058
info: p( <punct> |  ...) = [3gram] 0.76391493 [ -0.11695500 ] / 0.99999971
info: p( <punct> | <punct> ...) = [2gram] 0.29417110 [ -0.53140000 ] / 0.99999998
info: p( <punct> | <punct> ...) = [3gram] 0.51262054 [ -0.29020400 ] / 0.99999998
info: p( <punct> | <punct> ...) = [3gram] 0.51262054 [ -0.29020400 ] / 0.99999998
info: p( </s> | <punct> ...) = [3gram] 0.45569787 [ -0.34132300 ] / 0.99999998

info: 1 sentences, 11 words, 0 OOVs
info: 0 zeroprobs, logprob= -4.57026500 ppl= 2.40356248 ppl1= 2.60302678

info: 2 sentences, 24 words, 0 OOVs
info: 0 zeroprobs, logprob= -8.75503500 ppl= 2.23975957 ppl1= 2.31629103

info: work time shifting: 0 seconds

Saya pikir tidak ada yang istimewa untuk dikomentari, jadi kami akan melanjutkan lebih jauh.

Pemeriksaan Keberadaan Konteks


$ echo "<s>              </s>" | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method checktext -debug 1 -r-arpa ./lm.arpa -confidence

terminal

Uji:

<s>              </s>

Hasil:

YES | <s>              </s>

Hasilnya menunjukkan bahwa teks yang diperiksa memiliki konteks yang benar dalam hal model bahasa yang dikumpulkan.

Tandai [ -kepercayaan ] - artinya model bahasa akan dimuat saat dibangun, tanpa overtokenization.

Koreksi kasus kata


$ echo "         ???      ...." | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method fixcase -debug 1 -r-arpa ./lm.arpa -confidence

terminal

Uji:

         ???      ....

Hasil:

         ???       ....

Register dalam teks dipulihkan dengan mempertimbangkan konteks model bahasa.

Perpustakaan yang dijelaskan di atas untuk bekerja dengan model bahasa statistik peka huruf besar-kecil. Misalnya, N-gram " di Moskow besok akan hujan " tidak sama dengan N-gram " di Moskow akan hujan besok ", ini adalah N-gram yang sama sekali berbeda. Tetapi bagaimana jika case tersebut harus case-sensitive dan, pada saat yang sama, menduplikasi N-gram yang sama tidak rasional? ALM mewakili semua N-gram dalam huruf kecil. Ini menghilangkan kemungkinan duplikasi N-gram. ALM juga mempertahankan peringkat register kata di setiap N-gram. Saat mengekspor ke format teks model bahasa, register dipulihkan tergantung pada peringkat mereka.

Memeriksa jumlah N-gram


$ echo "         ???      ...." | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method counts -debug 1 -r-arpa ./lm.arpa -confidence

terminal

Uji:

         ???      ....

Hasil:

10 [3gram] | 
   N-   ,        .

Memeriksa jumlah N-gram dilakukan oleh ukuran N-gram dalam model bahasa. Ada juga kesempatan untuk memeriksa bigrams dan trigram .

Periksa Bigram


$ echo "         ???      ...." | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method counts -ngrams bigram -debug 1 -r-arpa ./lm.arpa -confidence

terminal

Uji:

         ???      ....

Hasil:

12 [2gram] |          ???      ….

Pemeriksaan Trigram


$ echo "         ???      ...." | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method counts -ngrams trigram -debug 1 -r-arpa ./lm.arpa -confidence

terminal

Uji:

         ???      ....

Hasil:

10 [3gram] |          ???      ….

Cari N-gram dalam bentuk teks


$ echo "       " | ./alm -alphabet "abcdefghijklmnopqrstuvwxyz" -method find -debug 1 -r-arpa ./lm.arpa -confidence

terminal

Uji:

       

Hasil:

<s> 
 
 
 
 
 
 
 
 </s>

Daftar N-gram yang ditemukan dalam teks. Tidak ada yang istimewa untuk dijelaskan di sini.

Variabel lingkungan


Semua parameter dapat dilewatkan melalui variabel lingkungan. Variabel dimulai dengan awalan ALM_ dan harus ditulis dalam huruf besar. Kalau tidak, nama variabel sesuai dengan parameter aplikasi.

Jika parameter aplikasi dan variabel lingkungan ditentukan, maka parameter aplikasi diberikan prioritas.

$ export $ALM_SMOOTHING=wittenbell
$ export $ALM_W-ARPA=./lm.arpa

Dengan demikian, proses perakitan bisa otomatis. Misalnya, melalui skrip BASH.

Kesimpulan


Saya mengerti bahwa ada teknologi yang lebih menjanjikan seperti RnnLM atau Bert . Tetapi saya yakin bahwa model statistik N-gram akan relevan untuk waktu yang lama.
Pekerjaan ini membutuhkan banyak waktu dan usaha. Dia terlibat di perpustakaan di waktu luangnya dari pekerjaan dasar, di malam hari dan di akhir pekan. Kode tidak mencakup pengujian, kesalahan dan bug dimungkinkan. Saya akan berterima kasih untuk pengujian. Saya juga terbuka untuk saran untuk peningkatan dan fungsionalitas perpustakaan baru. ALM didistribusikan di bawah lisensi MIT , yang memungkinkan Anda untuk menggunakannya hampir tanpa batasan.

Berharap mendapat komentar, kritik, saran.

Situs proyek Gudang proyek

All Articles