存储单词关联的数据结构

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), ....表示单词出现的频率及其与其他单词的关联。请注意这种数据类型的固有冗余性。显然,如果在Call下,ABC的频率为2,则在ABC下,Call的频率也是2。如何优化这个问题呢?
这个想法是在输入新句子时使用这些数据。例如,如果已经输入了Call,则可以从数据中轻松地得出ABC更可能出现在句子中,并将其作为第一个建议,随后是DEF
我意识到这只是实现预测的数百万种可能之一,我热切期待其他实现方式的建议。
谢谢。

我相当确信没有一个被广泛认可的答案,因为你的目标不够具体。基本上,这是一个人工智能问题,而人工智能解决方案通常有其自己的怪癖,人们可以接受;然而,如果不知道你确切的上下文,很难确定哪些怪癖是可以接受的。因此,我投票关闭你的问题。(这是一个非常有趣的问题,但在我看来不适合放在 Stack Overflow 上。) - zneak
话虽如此,您可以使用树形表示法来表示单词,并使树的每个分支保持一个概率。如果输入是重复的且语法相对固定,则这可能效果很好,但是如果要匹配自然语言,则会遇到麻烦。 - zneak
我可以使用一棵树,但我想消除数据中的冗余:word1与word2同时出现的频率显然与word2与word1同时出现的频率相同。此外,输入是连续的,因此概率是不可能的。 - WeNeigh
3个回答

1
也许可以使用双向图。您可以将单词存储为节点,边缘作为频率。

0
你也可以使用以下数据结构:
Map<String, Map<String, Long>>

Guava已在Table类中实现了此功能。http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/com/google/common/collect/Table.html - John B

0
我会考虑其中的两个选项:
选项1:
class Freq {
    String otherWord;
    int freq;
}

Multimap<String, Freq> mymap;

或者可能是一个表格

Table<String, String, int>

考虑到上述频率,您可能想要进行双向映射:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接