【问题标题】:How can I do a word frequency counter with OpenCL?如何用 OpenCL 做一个词频计数器?
【发布时间】:2022-01-14 19:36:32
【问题描述】:

我从 OpenCL 开始,想根据给定文本开发词频计数器。

我有一个单词向量,相同或不同的单词,现在我想用 OpenCL “减少”并知道我的向量中任何单词的频率。我需要在 OpenCL 中执行此操作,但是我在任何地方都没有在 OpenCL 中找到频率计数器(即使对于整数或其他数据类型),所以我不知道从哪里开始解决这个问题。

那么,我如何使用 OpenCL 做到这一点?我尝试使用地图,但我坚持将地图发送到设备并在那里进行缩减。

编辑:这是我的词向量,它将由一个函数填充,该函数将文件中的每一行分解为单词。语言是 C++,但欢迎使用 C 语言的任何解决方案!

std::vector<std::string> vetWords;

【问题讨论】:

  • C 还是 C++?选择一种语言。另外,展示你如何存储给定的文本。 “单词向量”- 那是 std::vector&lt;std::string&gt; 吗?我们不应该猜测。
  • 你是对的!原谅我,我编辑了问题以使其更清楚。
  • @MSalters 语言是 C++,但如果你给我 C 的提示,我会用它重新编写我的代码。所以,欢迎任何帮助
  • @MSalters 天哪,非常感谢!这将帮助我开始,现在我必须计算内核中每个单词的频率。我可以做一个向量来存储每个工作组或工作项中的频率然后“减少”吗?如果可能的话,我现在不...

标签: c++ c opencl


【解决方案1】:

您可以使用std::map 来查找给定行中出现的单词的频率,如下所示:

#include <iostream>
#include <map>
#include <sstream>

int main() {
    std::string inputString = "this is a string containing my name again and again and again ", word;
   
   //this map maps the std::string to their respective count
    std::map<std::string, int> wordCount;
    
    std::istringstream ss(inputString);
    //go word by word
    while(ss >> word)
    {
        wordCount[word]++;//increment the corresponding count
    }      
  
    std::cout<<"Total unique words are: "<<wordCount.size()<<std::endl;
    
    
    //iterate through map
    for( std::pair<std::string, int> pairElement: wordCount)
    {
        std::cout<<pairElement.first<<": "<<pairElement.second<<std::endl;
    }
   
    return 0;
}

以上程序的输出可见here

【讨论】:

  • 感谢您的宝贵时间和很好的回答,Anoop。但我已经用 C++ 绘制了地图来计算词频。现在我想将 OpenCL 中的代码“转换”为在 GPU 中运行。
  • 不客气。现在你的问题比以前更清楚了。您是否自己尝试过任何可以添加到问题中的代码。如果是,您应该将其添加到您的问题中。现在,我已投票重新打开您已关闭的问题,以便人们可以开始回答您的问题。
猜你喜欢
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
相关资源
最近更新 更多