Khả năng lưu trữ hiệu quả dữ liệu thống kê n-gram vào trong BF có được là do phân phối dạng Zipf (luật Zipf) 3 của các từ trong một ngữ liệu ngôn ngữ tự nhiên. Theo luật này, thì trong một ngữ liệu thông thường, từ xảy ra thường xuyên nhất nhiều gấp đôi từ xảy ra thường xuyên thứ hai, từ này lại nhiều bằng hai lần từ xảy ra thường xuyên thứ tư, … Lấy ví dụ đối với ngữ liệu Brown, “the” là từ xảy ra nhiều nhất, chiếm 7% tổng số từ. Đúng theo luật Zipf, từ có số lượng xếp thứ hai là “of” chiếm khoảng trên 3.5% một chút. Và chỉ cần khoảng 135 từ là đã chiếm một nửa tổng số từ của ngữ liệu Brown (theo Wikipedia). Như vậy tức là chỉ có một số ít sự kiện xảy ra thường xuyên trong khi hầu hết các sự kiện khác đều hiếm khi xảy ra.
Để biến BF thành một cấu trúc dữ liệu hỗ trợ lưu trữ cặp khóa – giá trị, với khóa là
n-gram còn giá trị là số lần xuất hiện n-gram trong ngữ liệu. Nhằm tối thiểu hóa số bit cần sử dụng, một thuật toán có tên mã hóa tần số log (log-frequency encoding) được sử dụng.
Số lần xuất hiện của các n-gram c(x) trước tiên được lượng tử hóa thành qc(x) sử dụng công thức:
[ ]
( ) 1 log ( )b
qc x = + c x
Điều này có nghĩa là tần suất xuất hiện của các n-gram sẽ bị suy giảm theo hàm mũ khi sử dụng quy trình mã hóa tần số log. Tuy nhiên do có sự khác biệt lớn trong phân phối của các sự kiện này nên tỉ lệ của mô hình vẫn được lưu giữ gần như nguyên vẹn trong BF- LM. Kích thước khoảng giá trị qc(x) được quyết định bởi cơ số b trong công thức trên.
Từng n-gram được lưu trữ vào trong BF cùng với giá trị qc(x) được biểu diễn bằng một số nguyên j tăng từ 1 đến qc(x). Đến giai đoạn kiểm tra thì tần suất của một n-gram được lấy ra bằng cách đếm tăng dần lên bắt đầu từ 1. Với mỗi loạt k hàm băm có kết quả trỏ tới các giá trị bằng 1 trong mảng bit BF, thì giá trị của n-gram lại được tăng thêm 1 đơn vị. Quá trình này tiếp diễn cho đến khi một hàm băm nào đó trỏ đến bit 0 trong mảng hoặc đạt đến giá trị đếm tối đa. Và khi đó giá trị đếm hiện tại trừ đi một được trả lại, chính là cận trên của qc(x) n-gram đó. Đối với hầu hết các n-gram thì quá trình này chỉ diễn ra một hoặc hai lần nhờ có quy trình mã hóa tần số log. Đặc tính lỗi-một-phía của Bloom Filter đảm bảo rằng giá trị lượng tử hóa qc(x) không thể lớn hơn giá trị được trả lại này. Quá trình huấn luyện và kiểm tra được minh họa qua Thuật toán 1 và Thuật toán 2 [35].
Thuật toán 1: Thuật toán huấn luyện BF
- Đầu vào:Strain, {h1,...,hk} và BF= ∅
- Đầu ra: Bloom Filter
for allx in Strain do
c(x) = tần suất của n-gram x in Strain
qc(x) = giá trị lượng tử hóa của c(x)
forj = 1 to qc(x) do fori = 1 to kdo
hi(x) = giá trị băm của sự kiện {x, j} với hi BF[hi(x)] = 1
end for end for
end for returnBF
Thuật toán 2: Thuật toán kiểm tra BF
- Đầu vào: x, MAXQCOUNT, {h1,...,hk} và BF
- Đầu ra: Cận trên của giá trị c(x) trong Strain
forj = 1 to MAXQCOUNT do for i = 1 to kdo
hi(x) = giá trị băm của sự kiện {x, j} với hi
ifBF[hi(x)] = 0 then
return E[c(x) | qc(x) = j]
end if end for end for
Số lần xuất hiện của n-gram sau đó được ước lượng sử dụng công thức:
1 1 [ ( ) | ( ) ] 2 j j b b E c x qc x = ≈j − + −
tiếp theo một thuật toán làm mịn sẽ được sử dụng để lấy ra lượng xác suất thực tế sẽ sử dụng trong tính toán [36].