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; 
} 

这将允许非常快速地更新数据对。