5

我試圖通過分析句子來實現預測。考慮下面的[相當無聊]句子用於存儲單詞關聯的數據結構

Call ABC 
Call ABC again 
Call DEF 

我想對上述句子的數據結構如下:

Call: (ABC, 2), (again, 1), (DEF, 1) 
ABC: (Call, 2), (again, 1) 
again: (Call, 1), (ABC, 1) 
DEF: (Call, 1) 

一般來說,Word: (Word_it_appears_with, Frequency), ....

請注意內在這種類型的數據冗餘。顯然,如果ABC的頻率在Call下爲2,則Call的頻率在ABC下爲2。我如何優化這個?

想法是在輸入新句子時使用這些數據。例如,如果從數據中鍵入Call,則很容易說出ABC更可能出現在句子中,並將其作爲第一個建議提供,然後再次和DEF

我意識到這是實現預測的一百萬種可能的方式之一,我迫切期待其他方式的建議。

謝謝

+0

我相當確信沒有確定的答案,因爲你的目標不夠明確。基本上,這是一個人工智能問題,人工智能解決方案通常有他們自己的怪癖,人們可以忍受;然而,如果不知道你的具體情況,很難說出哪些怪癖是可以接受的。出於這個原因,我正在投票結束你的問題。 (這是一個非常有趣的,只是不適合堆棧溢出在我看來。) – zneak

+0

這就是說,你可以使用樹形表示你的單詞,並讓樹的每個分支保持概率。如果輸入是重複的並且語法相對固定,這可能會很好,但是您會遇到與自然語言相匹配的問題。 – zneak

+0

我可以使用樹,但是我想消除數據中的冗餘:與word2發生的word1的頻率顯然與word1發生的word2的頻率相同。此外,輸入是連續的,所以概率是不可能的。 – WeNeigh

回答

1

也許使用雙向圖。您可以將單詞存儲爲節點,並將邊緣作爲頻率。

0

您可以使用下面的數據結構太:

Map<String, Map<String, Long>> 
+0

Guava已經在Table類中實現了這一點。 http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/com/google/common/collect/Table.html –

+0

@JohnB,這很好理解。謝謝(你的)信息。 –

0

我會考慮的兩個選項之一:

選項1:

class Freq { 
    String otherWord; 
    int freq; 
} 

Multimap<String, Freq> mymap; 

,或者一個表

Table<String, String, int> 

鑑於上述頻率:您可能想要進行雙向映射:

class Freq{ 
    String thisWord; 
    int otherFreq; 
    Freq otherWord; 
} 

這將允許非常快速地更新數據對。