Một số phương pháp làm mịn (smoothing) cho mô hình N-gram

phương pháp làm mịn
Một số phương pháp làm mịn (smoothing) cho mô hình N-gram
4 Tháng chín 2024 - 3:13 sáng
155
155
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ừ.

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

 

Nguyễn Văn Hiến

Tôi là Nguyễn Văn Hiến, Founder của Tummosoft. Tôi có hơn 20 năm lập trình, vào thời điểm máy vi tính còn là tài sản quý giá của người giàu. Nhưng sức đam mê công nghệ của tôi đã giúp tôi vượt qua những khó khăn và theo đuổi nghề lập trình. Đối với tôi, sáng tạo các sản phẩm công nghệ bằng ngôn ngữ cũng giống như người nghệ sĩ sáng tác những họa phẩm.

Bài viết liên quan