V. Thử nghiệm trên dữ liệu VOV (VOV Corpus)
B.2. Lý thuyết liên quan đến mô hình ngôn ngữ
B.2.1. Lý thuyết xác suất
70
Xác suất của sự kiện E, dùng để chỉ khả năng xảy ra sự kiện E trong phép thử đƣợc viết là P(E). Một sự kiện E có số lần xuất hiện là n trong tổng số N lần xảy ra thì xác suất của sự kiện E đối với tổ hợp sự kiện trên là :
P(E)=n/N. (số lần xuất hiện của sự kiện E trên tổng số lần xuất hiện của các sự kiện).
B.2.1.2. Xác suất có điều kiện
Xác suất mà biến cố E xảy ra khi biết việc xảy ra của biến cố F là một xác suất có điều kiện của E khi biết F, giá trị số của nó là P E( F) / ( )P F (với điều kiện là P(F) khác 0). Nếu xác suất có điều kiện của E khi biết F là bằng với xác suất ("không có điều kiện") của E, thì E và F đƣợc xem là các sự kiện độc lập. Vì quan hệ giữa E và F là đối xứng nên ta có thể nói rằng P E( F)P E P F( ) ( ).
Tổng quát hơn :
P(A,B,C,D)=P(A)*P(B|A)*P(C|A,B)*P(D|A,B,C). (1) Đối với dãy X1,X2,…Xn thì :
P(X1,X2,…Xn)=P(X1)*P(X2|X1)*P(X3|X1,X2)*…*P(Xn|X1,X2,X3…Xn-1). (2) B.2.2. Mô hình ngôn ngữ n-gram
Việc chúng ta cần phải tính các xác suất của chuỗi n từ P(W1,W2,…Wn) =P(W). Thay vì thế ta cần tính xác suất có điều kiện P (Wn| W1,W2..Wn-1) nghĩa là xác suất của từ Wn khi đã biết n-1 từ trƣớc đó.
Công thức tính xác suất cho chuỗi n từ.
71
B.2.4. Đánh giá mô hình ngôn ngữ bằng Perplexity
Để đo sự thực hiện của một mô hình ngôn ngữ dựa vào xác suất trung bình có thể đƣợc phát triển trong định luật thông tin (shannon). Một nguồn nói ra có thể coi nhƣ một khối thông tin nguồn mà sẽ sinh ra các từ tuần tự w1,w2, … ,wm từ bộ từ vựng W. Khả năng của kí hiệu i phụ thuộc vào i-1 kí hiệu trƣớc đó. Entropy H diễn tả số lƣợng các thông tin không dƣ thừa cung cấp cho mỗi từ mới ở giá trị trung bình, đƣợc tính bằng bít :
Công thức trên tính cho khả năng của tất cả các dãy từ, nhƣng nếu với dữ liệu nguồn là ergodic thì công thức trên tƣơng đƣơng với:
Hay
Coi một mô hình ngôn ngữ là một nguồn thông tin, thì một mô hình ngôn ngữ mà hoạt động hiệu quả nếu nó có khả năng đoán từ .
Perplexity, PP là một trong những thƣớc đo mô hình ngôn ngữ, đƣợc tính nhƣ sau:
72
Với
Là xác suất của dãy trong mô hình ngôn ngữ. Perplexity có thể đƣợc coi nhƣ là thƣớc đo giá trị trung bình các từ khác nhau có giá trị xác suất lớn nhất tƣơng đƣơng đi sau bất kể từ nào cho trƣớc. Giá trị perplexity thấp có nghĩa mô hình ngôn ngữ đó tốt hơn.
Để tính toán đƣợc perplexity của cả hai mô hình ngôn ngữ thì cần có một số dữ liệu test. Sự so sánh của hai mô hình ngôn ngữ phụ thuộc vào giá trị perplexity trên cùng một dữ liệu kiểm tra và bộ từ vựng tƣơng đƣơng .
73
Phụ lục C. Các mã nguồn của chƣơng trình
C1. Đọc thƣ mục chứa các file transcript và tạo thành một file duy nhất
import glob import os import re
#file nay khong su dung chi de tham khao
output = open("transcriptAll.txt","w",encoding='utf-8')
output2 = open("transcriptWithFileNamẹtxt","w",encoding='utf-8') p = rẹcompile('\w+',rẹIGNORECASE)
fName = str
for filename in glob.glob('transcript all\\*.txt'): with open(filename,"r",encoding='utf-8') as f: lines =f.readlines()
for line in lines:
if linẹendswith(ú.txt\n'):
fName = line[0:-5] #ten file loai bo di .txt else:
modified =line[3:-5].upper()#loai bo ky tu <s> o dau va </s> o cuoi modified =rẹsub(r'[.\'\"\,\;\:\-\”\(\)\…\“\–\?\!]','',modified)
output.write(modified + "\n")
74
C2. Loại bỏ những ký tự đặc biệt mà Sphinx không nhận dạng đƣợc thành số
import re
inputFile = open("transcriptEncripted.txt","r",encoding='utf-8') outputFile = open("transcript.txt","w",encoding='utf-8')
lines = inputFilẹreadlines() for line in lines:
edit1 = linẹreplace("`","2") edit2 = edit1.replace("~","3") edit3 = edit2.replace("?","4") edit4 = edit3.replace(".","6") edit5 = edit4.replace("'","5") edit6 = edit5.replace("^","8") edit7 = edit6.replace("(","7") edit8 = edit7.replace("+","9") edit9 = rẹsub('[/]\w+','',edit8)
edit10 = rẹsub(r'[#/]','',edit9) #edit10= edit9.replace('#/#','') #loai bo ky tu dac biet if edit10.strip() !='': words = edit10.split() print(words) #outputFilẹwrite('<s> ' + ' '.join(edit10.words[0:len(words)-2] + '</s> (' + words[-1] + ') edit11 = ' '.join(words[:-1]) edit12 = rẹsub(r'[^\w\s]','',edit11)
75
#outputFilẹwrite('<s> ' +' '.join(words[:-1]) + ' </s> (' +words[-1] +')\n') outputFilẹwrite('<s> ' + edit12.strip() + ' </s> (' +words[-1] +')\n')
C3. Tạo từ điển từ file transcript
# cu phap: python createDic.py y : neu dung thanh dieu #python createDic.py y : neu khong dung thanh dieu
import re import sys
#ham tach mot tu: Nghe -> ngh e hoac ban -> b a n def buildAmVi(word,thanhdieu):
start =0
end = -111 #ky tu cuoi cung la so last = str
amvi = list() start =0
if word[0:2].lower() in amdau: #doc 3 ky tu dau tien trong tu hien tai xem co la am dau hay khong
amvịappend(word[0:2]) start = 2
elif word[0:1].lower() in amdau: #doc 2 ky tu dau tien trong tu hien tai xem co la am dau hay khong
76 start =1 if word[-2:].lower() in amcuoi: last = word[-2:] end =-2 elif word[-1:].isalphă): last = word[-1:] end = -1
if end !=-111: #ky tu cuoi cung khong phai la so iterator = p.finditer(word[start:end]) for match in iterator:
if thanhdieu=='ý:
amvịappend(match.group(0)) else:
amvịappend(rẹsub(r'[23456]','',match.group(0))) #2,3,4,5,6 la cac thanh dieu
if len(word) != 1: #khong can them vao trong truong hop word chu co mot ky tu vd: P->P
amvịappend(last) else:
iterator = p.finditer(word[start:]) for match in iterator:
if thanhdieu=='ý:
amvịappend(match.group(0)) else:
77 if len(amvi) == 0:
amvịappend(word) return amvi;
thanhdieu=sys.argv[1]; #mo ta co dung thanh dieu hay khong, y neu co,n neu khong print ('Dung thanh dieu:' + sys.argv[1])
outputFile = open("tudien.dic","w",encoding='utf-8') inputFile = open("transcript.txt","r",encoding='utf-8') dic = set()
lines = inputFilẹreadlines() for line in lines:
words = linẹsplit()[1:-2] for word in words:
dic.ađ(word)
#chuyen dic thanh list de sort mylist = list(dic)
mylist.sort()
amdau =set(['b','c','ch','d','đ','g','gh','h','k','kh','l','m','n','ng','ngh','nh','p','ph','q', 'r','s','t','th','tr','v','x'])
78 p = rẹcompile('\w\d*',rẹIGNORECASE) line =str
for word in mylist: amvi = list()
outputFilẹwrite(word + ' ') #ghi vao file dic line =''
for w in word.split('_'):
amvi= buildAmVi(w,thanhdieu) line = line + ' '.join(amvi) + ' '
#outputFilẹwrite(" ".join(amvi) + ' ')
#if not word.endswith(w): #khong them ky tu space vao tu cuoi cung # outputFilẹwrite(' ')
outputFilẹwrite(linẹstrip()+ '\n')
C4. Tạo file transcript và test file từ danh sách file transcript và test
import re inputTranscript = open("asrvn_train.fileids","r") inputTestTranscript = open("asrvn_test.fileids","r") inputTranscriptAll = open('transcript.txt','r') outputTranscript = open("asrvn_train.transcription","w") outputTestTranscript = open("asrvn_test.transcription","w")
79 fileName =str
transcriptAllLines =inputTranscriptAll.readlines() lines = inputTranscript.readlines()
for line in lines:
fileName = linẹsplit('/')[1].strip() #tach ten file tu chuoi vd :ta/ox0328 for content in transcriptAllLines:
if content.strip().endswith(fileName[-6:] +')'): #chi lay 6 ky tu cuoi cua file vd TBox0328=>ox0328
#print(rẹsub(r'\(.*\)','('+ fileName+ ')',content))
outputTranscript.write(rẹsub(r'\(.*\)','('+ fileName+ ')',content)) break;
outputTranscript.close()
lines = inputTestTranscript.readlines() for line in lines:
fileName = linẹsplit('/')[1].strip() #tach ten file tu chuoi vd :ta/ox0328 for content in transcriptAllLines:
if content.strip().endswith(fileName[-6:] +')'):
outputTestTranscript.write(rẹsub(r'\(.*\)','('+ fileName+ ')',content)) break;
outputTestTranscript.close() print('done!')