আপনি এন এর সর্বোত্তম পরিসরটি জানেন না তা প্রদত্ত, আপনি অবশ্যই এটি পরিবর্তন করতে সক্ষম হতে চান। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনটি কোনও নির্দিষ্ট পাঠ্য ইংরেজী হওয়ার সম্ভাবনাটি পূর্বাভাস করে তবে আপনি সম্ভবত এন 3..5 এর জন্য এন-গ্রাম অক্ষরটি ব্যবহার করতে চাইবেন। (এটি আমরা পরীক্ষামূলকভাবে পেয়েছি))
আপনি আপনার অ্যাপ্লিকেশন সম্পর্কে বিশদ ভাগ করে নি, তবে সমস্যাটি যথেষ্ট পরিষ্কার। আপনি কোনও রিলেশনাল ডাটাবেসে এন-গ্রাম ডেটা উপস্থাপন করতে চান (বা নোএসকিউএল ডকুমেন্ট-ভিত্তিক সমাধান)। আমার নিজের সমাধানের পরামর্শ দেওয়ার আগে আপনি নিম্নলিখিত পদ্ধতিগুলি একবার দেখে নিতে পারেন:
- গুগল এনজিগ্রামকে কীভাবে একটি ডাটাবেসে সেরা সঞ্চয় করবেন?
- টেবিলের <n সংখ্যায় ডাটাবেসে এন-গ্রাম সঞ্চয়
- রিলেশনাল ডেটাবেস সহ গুগল ওয়েব 1T 5-গ্রাম পরিচালনা করা
এখন, উপরের লিঙ্কগুলির কোনওটি না পড়ে, আমি একাধিক টেবিল ব্যবহার করে একটি সাধারণ, সম্পর্কিত সম্পর্কিত ডাটাবেস পদ্ধতির পরামর্শ দিচ্ছি, এন-গ্রামের প্রতিটি আকারের জন্য একটি। আপনি সর্বাধিক প্রয়োজনীয় কলামগুলির সাথে সমস্ত ডেটা একক টেবিলের মধ্যে রাখতে পারেন (যেমন বিগ্র্রামগুলি এবং ট্রিগ্রামগুলি এনগ্রামে স্টোর করুন, চূড়ান্ত কলামগুলি বাতিল করে রেখে যাবে), তবে আমি ডেটা বিভাজন করার পরামর্শ দিচ্ছি। আপনার ডাটাবেস ইঞ্জিনের উপর নির্ভর করে, প্রচুর সংখ্যক সারি সহ একটি একক টেবিল কার্যকারিতাটিকে নেতিবাচকভাবে প্রভাবিত করতে পারে।
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));
এরপরে, আমি আপনাকে একটি কোয়েরি দেব যা আপনার সমস্ত এনজিআর টেবিলের পরে দেওয়া সবচেয়ে সম্ভাব্য পরবর্তী শব্দটি ফিরিয়ে দেবে। তবে প্রথমে, এখানে কিছু নমুনা তথ্য যা আপনার উপরের টেবিলগুলিতে shouldোকানো উচিত:
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
আপনি যদি আরও এনগ্রাম টেবিল যোগ করেন তবে আপনাকে উপরের ক্যোয়ারিতে আরও একটি ইউনিয়ন ধারা যুক্ত করতে হবে। আপনি খেয়াল করতে পারেন যে প্রথম ক্যোয়ারিতে আমি শব্দ 1 = @ শব্দ 3 ব্যবহার করেছি। এবং দ্বিতীয় ক্যোয়ারিতে, শব্দ 1 = @ শব্দ 2 এবং শব্দ 2 = @ শব্দ 3। এটি কারণ আমাদের এনগ্রাম ডেটার জন্য ক্যোয়ারিতে তিনটি শব্দ সারিবদ্ধ করা দরকার । আমরা যদি তিনটি শব্দের অনুক্রমের জন্য সম্ভাব্য পরবর্তী শব্দটি চাই, তবে আমাদের ক্রমটির শব্দের শেষ শব্দের বিপরীতে বিগ্রামের ডাটাতে প্রথম শব্দটি পরীক্ষা করা দরকার ।
আপনি নিজের ইচ্ছে মতো ওজনের প্যারামিটারগুলি টুইচ করতে পারেন। এই উদাহরণে, আমি ধরে নিয়েছি যে উচ্চতর অর্ডিনাল "এন" গ্রাম আরও নির্ভরযোগ্য হবে।
PS আমি কনফিগারেশনের মাধ্যমে এনজিআর_এন টেবিলের যে কোনও সংখ্যা পরিচালনা করতে প্রোগ্রাম কোডটি গঠন করব। আপনি এনজিআর_৫ এবং এনজিআর_6 টেবিল তৈরি করার পরে প্রোগ্রামটি এন-গ্রাম রেঞ্জ এন (১..6) ব্যবহার করার জন্য ঘোষিতভাবে পরিবর্তন করতে পারেন।