【问题标题】:What is the best Algorithm for finding word sequence frequency in a stream在流中查找单词序列频率的最佳算法是什么
【发布时间】:2013-08-29 03:21:10
【问题描述】:

我正在处理传入的文本流。例如 美国、英国、中国、俄罗斯、美国、英国、中国、法国、德国。

我需要将它们分成 3 个单词(或者 n 个单词)的序列,并分析哪个序列的频率最高。在上述情况下,序列 USA, UK, China 出现了两次。所以它的频率最高。

此外,我需要索引所有序列的频率。我曾尝试使用 C++ stl map 来部分解决一些问题,但我认为该解决方案并不优雅。原因是唯一索引m个唯一词,使用stl map在3词序列中,数学如下,

i x m x m + j x m + k

i, j, k 是每个单词的整数映射。

上述解决方案的问题在于连续的文本流,我们不知道唯一词的总数,或 m。谁能推荐一个更好的算法?

【问题讨论】:

    标签: c++ database algorithm analytics bigdata


    【解决方案1】:

    我认为你最好使用某种映射或三元组哈希表,因为这样你只存储实际出现的三元组,而使用数组你可以为所有可能的三元组腾出空间。如果您看到 n 个单词,它们可能都不同,在这种情况下,您存储大约 n 个三元组 - 但包含 n 个不同单词的所有三元组的数组大小为 n^3。

    出于好奇,存在从非负整数对到非负整数的双射映射。其中之一是 (a,b)->(a+b)(a+b+1)/2 + b 映射 (0, 0) (0, 1) (1, 0) (0, 2) (1 , 1) (2,1) ... 到 0, 1, 2, 3, 4, 5, .. - 将其视为通过将它们写在正方形中然后对对角线编号来对它们进行编号。您可以使用它两次将三组数字映射到一个数字:(a, b, c) -> ((a, b), c)。然而它并不是很实用。

    【讨论】:

    • 我发现你的方法很有趣。你能解释一下为什么映射 (a, b, c) -> ((a, b), c) 不实用吗?
    • ((10,10),10) -> (220,10) -> 26575 所以我认为这些数字很快就会变得不切实际。
    【解决方案2】:

    另一种选择是使用std::string 作为地图的键。 每个键可以是 3 个单词的串联。这样,您可以唯一地定义每个三元组,而无需知道 m。

    但是,您必须为 2 个字符串实现 order 运算符,并将其作为地图声明的第三个参数传递,如本线程所述:std::string as a key in std::map using a compare operator。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:
      map<vector<unsigned int>, unsigned int> sequenceFrequency;
      vector<unsigned int> codedWord;
      
      void MapSequenceFrequency(unsigned int key0, unsigned int key1, unsigned int key2)
      {
          codedWord[0] = key0;
          codedWord[1] = key1;
          codedWord[2] = key2;
      
          map<vector<unsigned int>, unsigned int>::iterator it;
      
          if (sequenceFrequency.find(codedWord) == sequenceFrequency.end())
              sequenceFrequency[codedWord] = 0;
          else
              sequenceFrequency[codedWord]++;
      }
      

      【讨论】:

      • 感谢您的建议,它给了我解决问题的见解。对于字符串美国、英国、中国、俄罗斯、美国、英国、中国、法国、德国,我编码如下 USA = 0 UK = 1 China = 2 Russia = 3 France = 4 Germany = 5 下面是我的解决方案。为了在 C++ 中创建多键映射,我们使用向量作为键容器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 2013-03-13
      • 2013-03-17
      相关资源
      最近更新 更多