यह देखते हुए कि आप N की इष्टतम सीमा नहीं जानेंगे, आप निश्चित रूप से इसे बदलना चाहते हैं। उदाहरण के लिए, यदि आपका आवेदन इस संभावना की भविष्यवाणी करता है कि एक निश्चित पाठ अंग्रेजी है, तो आप संभवतः एन 3..5 के लिए चरित्र एन-ग्राम का उपयोग करना चाहेंगे। (यही हमने प्रयोगात्मक रूप से पाया।)
आपने अपने आवेदन के बारे में विवरण साझा नहीं किया है, लेकिन समस्या पर्याप्त है। आप एक रिलेशनल डेटाबेस (या NoSQL दस्तावेज़-आधारित समाधान) में एन-ग्राम डेटा का प्रतिनिधित्व करना चाहते हैं। अपने स्वयं के समाधान का सुझाव देने से पहले, आप निम्नलिखित दृष्टिकोणों पर एक नज़र रखना चाहते हैं:
- Google ngrams को डेटाबेस में कैसे स्टोर करें?
- डेटाबेस में <n- तालिकाओं में एन-ग्राम का भंडारण
- रिलेशनल डेटाबेस के साथ Google वेब 1T 5-ग्राम का प्रबंधन करना
अब, ऊपर दिए गए किसी भी लिंक को नहीं पढ़ रहा है, मैं सुझाव देता हूं कि एन-ग्राम के प्रत्येक आकार के लिए एक से अधिक तालिकाओं का उपयोग करके एक सरल, संबंधपरक डेटाबेस दृष्टिकोण। आप सभी डेटा को एक ही तालिका में अधिकतम आवश्यक स्तंभों के साथ रख सकते हैं (जैसे ngram_4 में बिग्रेड और ट्रिगर्स संग्रहीत करते हैं, अंतिम कॉलम को शून्य छोड़ते हुए), लेकिन मैं डेटा को विभाजित करने की सलाह देता हूं। आपके डेटाबेस इंजन के आधार पर, बड़ी संख्या में पंक्तियों वाली एक एकल तालिका प्रदर्शन को नकारात्मक रूप से प्रभावित कर सकती है।
create table ngram_1 (
word1 nvarchar(50),
frequency FLOAT,
primary key (word1));
create table ngram_2 (
word1 nvarchar(50),
word2 nvarchar(50),
frequency FLOAT,
primary key (word1, word2));
create table ngram_3 (
word1 nvarchar(50),
word2 nvarchar(50),
word3 nvarchar(50),
frequency FLOAT,
primary key (word1, word2, word3));
create table ngram_4 (
word1 nvarchar(50),
word2 nvarchar(50),
word3 nvarchar(50),
word4 nvarchar(50),
frequency FLOAT,
primary key (word1, word2, word3, word4));
अगला, मैं आपको एक क्वेरी दूंगा जो आपके सभी एनग्राम टेबल को दिए गए सबसे संभावित अगले शब्द को वापस कर देगा। लेकिन पहले, यहां कुछ नमूना डेटा दिए गए हैं, जिन्हें आपको उपरोक्त तालिकाओं में सम्मिलित करना चाहिए:
INSERT [ngram_2] ([word1], [word2], [frequency]) VALUES (N'building', N'with', 0.5)
INSERT [ngram_2] ([word1], [word2], [frequency]) VALUES (N'hit', N'the', 0.1)
INSERT [ngram_2] ([word1], [word2], [frequency]) VALUES (N'man', N'hit', 0.2)
INSERT [ngram_2] ([word1], [word2], [frequency]) VALUES (N'the', N'bat', 0.7)
INSERT [ngram_2] ([word1], [word2], [frequency]) VALUES (N'the', N'building', 0.3)
INSERT [ngram_2] ([word1], [word2], [frequency]) VALUES (N'the', N'man', 0.4)
INSERT [ngram_2] ([word1], [word2], [frequency]) VALUES (N'with', N'the', 0.6)
INSERT [ngram_3] ([word1], [word2], [word3], [frequency]) VALUES (N'building', N'with', N'the', 0.5)
INSERT [ngram_3] ([word1], [word2], [word3], [frequency]) VALUES (N'hit', N'the', N'building', 0.3)
INSERT [ngram_3] ([word1], [word2], [word3], [frequency]) VALUES (N'man', N'hit', N'the', 0.2)
INSERT [ngram_3] ([word1], [word2], [word3], [frequency]) VALUES (N'the', N'building', N'with', 0.4)
INSERT [ngram_3] ([word1], [word2], [word3], [frequency]) VALUES (N'the', N'man', N'hit', 0.1)
INSERT [ngram_3] ([word1], [word2], [word3], [frequency]) VALUES (N'with', N'the', N'bat', 0.6)
INSERT [ngram_4] ([word1], [word2], [word3], [word4], [frequency]) VALUES (N'building', N'with', N'the', N'bat', 0.5)
INSERT [ngram_4] ([word1], [word2], [word3], [word4], [frequency]) VALUES (N'hit', N'the', N'building', N'with', 0.3)
INSERT [ngram_4] ([word1], [word2], [word3], [word4], [frequency]) VALUES (N'man', N'hit', N'the', N'building', 0.2)
INSERT [ngram_4] ([word1], [word2], [word3], [word4], [frequency]) VALUES (N'the', N'building', N'with', N'the', 0.4)
INSERT [ngram_4] ([word1], [word2], [word3], [word4], [frequency]) VALUES (N'the', N'man', N'hit', N'the', 0.1)
सबसे संभावित अगले शब्द को क्वेरी करने के लिए, आप इस तरह से एक क्वेरी का उपयोग करेंगे।
DECLARE @word1 NVARCHAR(50) = 'the'
DECLARE @word2 NVARCHAR(50) = 'man'
DECLARE @word3 NVARCHAR(50) = 'hit'
DECLARE @bigramWeight FLOAT = 0.2;
DECLARE @trigramWeight FLOAT = 0.3
DECLARE @fourgramWeight FLOAT = 0.5
SELECT next_word, SUM(frequency) AS frequency
FROM (
SELECT word2 AS next_word, frequency * @bigramWeight AS frequency
FROM ngram_2
WHERE word1 = @word3
UNION
SELECT word3 AS next_word, frequency * @trigramWeight AS frequency
FROM ngram_3
WHERE word1 = @word2
AND word2 = @word3
UNION
SELECT word4 AS next_word, frequency * @fourgramWeight AS frequency
FROM ngram_4
WHERE word1 = @word1
AND word2 = @word2
AND word3 = @word3
) next_words
GROUP BY next_word
ORDER BY SUM(frequency) DESC
यदि आप अधिक ngram टेबल जोड़ते हैं, तो आपको उपरोक्त क्वेरी में एक और UNION क्लॉज जोड़ना होगा। आप देख सकते हैं कि पहली क्वेरी में मैंने word1 = @ word3 का उपयोग किया था। और दूसरी क्वेरी में, word1 = @ word2 और word2 = @ word3। ऐसा इसलिए है क्योंकि हमें एनग्राम डेटा के लिए क्वेरी में तीन शब्दों को संरेखित करने की आवश्यकता है । यदि हम तीन शब्दों के अनुक्रम के लिए सबसे अधिक संभावना वाला अगला शब्द चाहते हैं, तो हमें अनुक्रम में शब्दों के अंतिम शब्द के खिलाफ बिग्राम डेटा में पहले शब्द की जांच करने की आवश्यकता होगी ।
आप अपनी इच्छानुसार वजन मापदंडों को ट्विक कर सकते हैं। इस उदाहरण में, मैंने मान लिया कि उच्चतर "n" ग्राम अधिक विश्वसनीय होगा।
पुनश्च मैं विन्यास के माध्यम से किसी भी संख्या में ngram_N तालिकाओं को संभालने के लिए प्रोग्राम कोड की संरचना करेगा। आप ngram_5 और ngram -6 टेबल बनाने के बाद एन-ग्राम रेंज एन (1..6) का उपयोग करने के लिए कार्यक्रम को घोषित रूप से बदल सकते हैं।