【问题标题】:Data structure for storing word associations存储词关联的数据结构
【发布时间】:2011-11-11 20:36:09
【问题描述】:

我正在尝试通过分析句子来实现预测。考虑以下 [相当无聊的] 句子

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

我意识到这是实现预测的一百万种可能方法之一,我热切期待其他方法的建议。

谢谢

【问题讨论】:

  • 我很确定没有明确的答案,因为您的目标不够具体。基本上,这是一个人工智能问题,人工智能解决方案通常有自己的怪癖,人们可以忍受;但是,如果不知道您的确切上下文,很难说出什么怪癖是可以接受的。出于这个原因,我投票结束你的问题。 (这是一个非常有趣的,在我看来只是不适合 Stack Overflow。)
  • 也就是说,您可以使用树表示您的单词,并让树的每个分支都有一个概率。如果输入是重复的并且语法相对固定,这可能会很好用,但是您将无法匹配这样的自然语言。
  • 我可以使用树,是的,但我想消除数据中的冗余:word1 与 word2 一起出现的频率显然与 word2 与 word1 一起出现的频率相同。此外,输入是连续的,所以概率是不可能的。

标签: java string data-structures artificial-intelligence prediction


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您也可以使用以下数据结构:

    Map<String, Map<String, Long>>
    

    【讨论】:

    【解决方案3】:

    我会考虑以下两种选择之一:

    选项 1:

    class Freq {
        String otherWord;
        int freq;
    }
    
    Multimap<String, Freq> mymap;
    

    或者可能是一张桌子

    Table<String, String, int>
    

    鉴于上述频率:您可能想要进行双向映射:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多