2010-05-17 70 views
3

如果我正在編寫一段軟件,試圖預測用戶打算用什麼詞輸入下一個使用用戶鍵入的前兩個單詞,我會創建兩個表。在<n個表中存儲n-gram數據庫

像這樣:

== 1-gram table == 
Token | NextWord | Frequency 
------+----------+----------- 
"I" | "like" | 15 
"I" | "hate" | 20 

== 2-gram table == 
Token | NextWord | Frequency 
---------+------------+----------- 
"I like" | "apples" | 8 
"I like" | "tomatoes" | 12 
"I hate" | "tomatoes" | 20 
"I hate" | "apples" | 2 

根據這個實例執行力度用戶鍵入「I」和軟件,使用上述數據庫,預測下一個單詞的用戶將會類型是「恨」。如果用戶輸入「憎恨」,那麼軟件將預測用戶打算輸入的下一個單詞是「西紅柿」。

但是,這種實現需要我選擇考慮的每個附加n元表。如果我決定在預測下一個單詞時想考慮前面的5或6個單詞,那麼我需要5-6個表格,並且每個n-gram的空間呈指數級增長。

什麼是最好的方式來表示這隻有一個或兩個表,沒有我能支持的n-gram數量的上限?

回答

2

嘗試一個兩列表 -

phrase, frequency 

一個優化將是「noramalise」短語中的一些單詞,例如「不」,「不」。

第二個優化是使用短語的MD5,CRC32或類似的散列作爲鍵。

+0

+1表示散列。如果您使用的是大型語料庫或長字符串,那麼使用散列將是必不可少的*以獲得足夠的性能。由於不可避免的碰撞,你仍然需要保留原始字符串,唉。 – egrunin 2010-05-18 07:14:10

1

實際上,您可以按照自己的方式放置它,只使用一個表格。二克不能等於一克,因爲二克將會有一個空格。同樣,沒有三克將等於任何二克,因爲三克將有兩個空格。無限廣告。

因此,您可以將所有1克,2克等放入Token字段中,並且不會發生碰撞。

2

爲什麼不把它們全部存儲在一張表中?

Token | NextWord | Frequency 
---------+------------+----------- 
"I"  | "like"  | 15 
"I"  | "hate"  | 20 
"I like" | "apples" | 8 
"I like" | "tomatoes" | 12 
"I hate" | "tomatoes" | 20 
"I hate" | "apples" | 2 

那麼這將會是到你的軟件來決定你傳遞什麼在「令牌」,也當您插入新的值(即不要插入部分類型的字)。如果你想變得棘手,你可以有一個額外的字數的列,但我不認爲這實際上是必需的(空格的數量+ 1是字的數量)

相關問題