Một trong những vấn đề lớn của mô hình N-gram là chúng chỉ được đào tạo trong một kho ngữ liệu có giới hạn, nó mang tính hữu hạn, nghĩa là chúng ta có thể chấp nhận là giải pháp N-gram là không thể có đầy đủ các từ. Chúng ta chứng kiến một thực tế rằng, ma trận bigram của bất kỳ kho ngữ liệu nào đều không thể đạt mức toàn diện. Có rất nhiều từ vựng sẽ có tần suất lặp lại bằng 0, mặc dù đó không phải là loại từ sai chính tả. Và đây là nhược điểm của mô hình N-gram khi nó đánh giá thấp các chuỗi kế tiếp có xác suất kém hơn trong kho văn bản.
Để khắc phục nhược điểm này, chúng ta cần đánh giá lại các từ vựng có xác suất thấp và gán cho chúng các giá trị lớn hơn 0. Quá trình này được gọi là phương pháp làm mịn (smoothing).
Các thuật toán làm mịn phổ biến dùng để ứng dụng cho mô hình N-gram là Laplace, Witten-Bell, Good-Turing, Kneser-Ney, Backoff và Deleted Interpolation.
Phương pháp Làm Mịn Witten-Bell: Tổng Quan và Ứng Dụng trong NLP
Kỹ thuật Witten-Bell được sử dụng để xử lý vấn đề các chuỗi N-gram chưa từng xuất hiện trong kho ngữ liệu huấn luyện, đặc biệt trong các trường hợp số lượng văn bản đào tạo ít. Nó sẽ phân phối lại tần suất của các chuỗi chưa từng xuất hiện bằng cách phân phối lại xác suất từ các sự kiện đã được thu thập.
Lý thuyết Witten-Bell giả định rằng, các n-gram chưa từng xuất hiện trong dữ liệu huấn luyện có thể được ước tính giả định từ các sự kiện đã có bằng cách điều chỉnh phân phối xác suất của các n-gram bằng cách phân bổ lại một phần xác suất từ các n-gram đã quan sát sang các n-gram chưa quan sát.
Witten-Bell cân bằng dữ liệu chưa từng xuất hiện và dữ liệu đã được đào tạo bằng cách sử dụng phương pháp nội suy đơn giản.
T: Tổng số đơn vị n-gram không trùng lặp được đào tạo
N: Tổng số đơn vị n-gram đếm được
P(wi): Công thức xác suất cho n-gram đã được đào tạo
C(wi): Công thức xác suất cho đơn vị n-gram chưa có trong dữ liệu
Module WittenBellSmoothing
' Function to calculate Witten-Bell smoothed probabilities
Function WittenBellProbability(ngrams As Dictionary(Of String, Integer), totalTokens As Integer) As Dictionary(Of String, Double)
Dim smoothedProbabilities As New Dictionary(Of String, Double)()
Dim uniqueNgramsCount As Integer = ngrams.Count ' T - number of unique n-grams
For Each ngram In ngrams
Dim probability As Double = ngram.Value / (totalTokens + uniqueNgramsCount)
smoothedProbabilities.Add(ngram.Key, probability)
Next
' Probability of unseen n-grams
Dim unseenProbability As Double = uniqueNgramsCount / (totalTokens + uniqueNgramsCount)
Console.WriteLine($"Probability for unseen n-grams: {unseenProbability}")
Return smoothedProbabilities
End Function
Sub Main()
' Sample bigram counts
Dim bigramCounts As New Dictionary(Of String, Integer) From {
{"the cat", 4},
{"cat sat", 3},
{"sat on", 2},
{"on the", 2}
}
' Total number of bigrams (tokens)
Dim totalBigrams As Integer = bigramCounts.Values.Sum()
' Calculate smoothed probabilities
Dim smoothedProbs As Dictionary(Of String, Double) = WittenBellProbability(bigramCounts, totalBigrams)
' Output probabilities
For Each kvp In smoothedProbs
Console.WriteLine($"Probability of '{kvp.Key}': {kvp.Value}")
Next
End Sub
End Module
Phương pháp Làm Mịn Good-Turing: Một Cách Tiếp Cận Khác trong NLP
Phương pháp Good-Turing là một công cụ mạnh mẽ trong việc xử lý các vấn đề liên quan đến ước lượng xác suất của các sự kiện hiếm gặp trong NLP.
Bạn nên lưu ý rằng, có sự khác biệt giữa Good-Turing và Witten-Bell: Trong khi Good-Turing tập trung vào việc điều chỉnh tần số của các n-gram đã xuất hiện, còn Witten-Bell tập trung vào việc phân bổ xác suất cho các n-gram chưa xuất hiện.
Nr: Số lượng đơn vị n-grams đã được tìm thấy r lần.
r*: Tần số được điều chỉnh từ đơn vị n-gram đã tìm thấy r lần.
P(unseen): Xác suất của đơn vị n-gram chưa từng xuất hiện với r = 0:
N1: Là số lượng n-gram tìm thấy chính xác một lần, và N là tổng số ngram đã được tìm thấy chính xác.
Module GoodTuringSmoothing
' Function to calculate Good-Turing smoothed probabilities
Function GoodTuringProbability(ngrams As Dictionary(Of String, Integer)) As Dictionary(Of String, Double)
Dim smoothedProbabilities As New Dictionary(Of String, Double)()
Dim frequencyOfFrequencies As New Dictionary(Of Integer, Integer)()
Dim totalNgrams As Integer = ngrams.Values.Sum() ' Total number of n-grams
' Count frequency of frequencies (Nr)
For Each count In ngrams.Values
If frequencyOfFrequencies.ContainsKey(count) Then
frequencyOfFrequencies(count) += 1
Else
frequencyOfFrequencies(count) = 1
End If
Next
' Calculate adjusted frequencies (r*)
Dim adjustedFrequencies As New Dictionary(Of Integer, Double)()
For Each kvp In frequencyOfFrequencies
Dim r As Integer = kvp.Key
Dim Nr As Integer = kvp.Value
Dim NrPlusOne As Integer = If(frequencyOfFrequencies.ContainsKey(r + 1), frequencyOfFrequencies(r + 1), 0)
Dim adjustedFrequency As Double = If(NrPlusOne > 0, (r + 1) * (NrPlusOne / Nr), r) ' r* calculation
adjustedFrequencies(r) = adjustedFrequency
Next
' Assign smoothed probabilities
For Each ngram In ngrams
Dim r As Integer = ngram.Value
Dim rStar As Double = adjustedFrequencies(r)
Dim probability As Double = rStar / totalNgrams
smoothedProbabilities.Add(ngram.Key, probability)
Next
' Probability of unseen n-grams
Dim unseenProbability As Double = If(frequencyOfFrequencies.ContainsKey(1), frequencyOfFrequencies(1) / totalNgrams, 0)
Console.WriteLine($"Probability for unseen n-grams: {unseenProbability}")
Return smoothedProbabilities
End Function
Sub Main()
' Sample bigram counts
Dim bigramCounts As New Dictionary(Of String, Integer) From {
{"the cat", 4},
{"cat sat", 3},
{"sat on", 2},
{"on the", 2}
}
' Calculate smoothed probabilities using Good-Turing method
Dim smoothedProbs As Dictionary(Of String, Double) = GoodTuringProbability(bigramCounts)
' Output probabilities
For Each kvp In smoothedProbs
Console.WriteLine($"Probability of '{kvp.Key}': {kvp.Value}")
Next
End Sub
End Module