เนื่องจากคุณจะไม่ทราบช่วงที่เหมาะสมที่สุดของ N คุณจึงต้องการเปลี่ยนได้อย่างแน่นอน ตัวอย่างเช่นหากแอปพลิเคชันของคุณคาดการณ์ว่าข้อความบางข้อความเป็นภาษาอังกฤษคุณอาจต้องการใช้อักขระ N-grams สำหรับ N 3..5 (นั่นคือสิ่งที่เราพบในการทดลอง)
คุณยังไม่ได้แชร์รายละเอียดเกี่ยวกับแอปพลิเคชันของคุณ แต่ปัญหานั้นชัดเจนเพียงพอ คุณต้องการแสดงข้อมูล N-Gram ในฐานข้อมูลเชิงสัมพันธ์ (หรือโซลูชันที่ใช้เอกสาร NoSQL) ก่อนที่จะแนะนำวิธีแก้ปัญหาด้วยตัวคุณเองคุณอาจต้องการดูวิธีการต่อไปนี้:
- วิธีเก็บ Google ngrams ในฐานข้อมูลได้ดีที่สุด
- การจัดเก็บ n-grams ในฐานข้อมูลใน <n จำนวนตาราง
- การจัดการ Google Web 1T 5 กรัมด้วยฐานข้อมูลเชิงสัมพันธ์
ตอนนี้เมื่อไม่ได้อ่านลิงก์ข้างต้นใด ๆ ฉันขอแนะนำวิธีการฐานข้อมูลเชิงสัมพันธ์ที่เรียบง่ายโดยใช้หลายตารางหนึ่งตารางสำหรับ N-gram แต่ละขนาด คุณสามารถใส่ข้อมูลทั้งหมดในตารางเดียวด้วยคอลัมน์ที่จำเป็นสูงสุด (เช่นเก็บ bigrams และ trigrams ใน 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 AND word2 = @ word3 นั่นเป็นเพราะเราจำเป็นต้องจัดตำแหน่งสามคำในแบบสอบถามสำหรับข้อมูล ngram หากเราต้องการคำถัดไปที่มีโอกาสมากที่สุดสำหรับลำดับสามคำเราจะต้องตรวจสอบคำแรกในข้อมูล bigram เทียบกับคำสุดท้ายของคำในลำดับนั้น
คุณสามารถปรับแต่งพารามิเตอร์น้ำหนักตามที่คุณต้องการ ในตัวอย่างนี้ฉันคิดว่าลำดับที่สูงกว่า "n" กรัมจะเชื่อถือได้มากขึ้น
PS ฉันจะโครงสร้างรหัสโปรแกรมเพื่อจัดการตาราง ngram_N จำนวนเท่าใดก็ได้ผ่านการกำหนดค่า คุณสามารถเปลี่ยนโปรแกรมให้ใช้ช่วง N-gram N (1..6) ได้อย่างชัดเจนหลังจากสร้างตาราง ngram_5 และ ngram_6