每条推文中不重复的单词总数

Posted

技术标签:

【中文标题】每条推文中不重复的单词总数【英文标题】:Total number of non repeated words in each tweet 【发布时间】:2016-02-16 23:37:27 【问题描述】:

我是 java 和 Trident 的新手,我导入了获取推文的项目,但我想得到一些东西 当我从 tuple.getValue(0); 仅表示第一条推文的代码中获得时,这段代码如何获得不止一条推文?!

我的问题是获取 hashset 或 hashmap 中的所有推文以获取每条推文中独特词的总数

public void execute(TridentTuple tuple, TridentCollector collector) 

此方法用于在推文上执行方程式

public Values getValues(Tweet tweet, String[] words)
 

这段代码得到了第一条推文,然后得到了它的正文,将它转换为字符串数组,我知道我需要解决什么但写得不好

我的想法: 像

一样制作 for 循环
for (int i=0;i<10;i++)

 Tweet tweet = (Tweet) tuple.getValue(i);   

【问题讨论】:

您知道Set 的基本属性吗?提示:Set 不允许重复。根据您的需要推断。 感谢您的回复,不,我不知道,但是请问您知道三叉戟吗,我想我需要这样写 str = br.readLine() 会给我一行。 str.split(" ") 会给我字符串数组,然后遍历数组的每个元素并将其存储在哈希集中,但问题是在推文中循环! 这是否意味着您想要获取跨多个推文的唯一单词列表?抱歉,您的问题不清楚。 我需要获取每条推文中唯一单词的总数,编辑帖子并附上示例 目前还很不清楚。您的示例代码根本没有显示您在任何地方收集推文的字数。 【参考方案1】:
    对于每条推文: 对于推文中的每个单词: 尝试将每个单词添加到集合中。 如果该词已存在于集合中,则将其从集合中移除。 包含该推文的单词集的计数大小。

【讨论】:

感谢您的回复,我很好,但我的问题是如何循环推文以获取每条推文,因为我尝试了这个 for (int i=0;i 使用 tuple.getValues(),它返回一个对象列表。遍历该列表,而不是尝试分别检索每条推文。 谢谢,你的意思是这样吗 for (int i=0;i 列出 tweetList = tuple.getvalues(); 谢谢,但不能作为推文类型的元组返回对象,我不能像上面的方法那样写好 Tweet tweet = (Tweet) tuple.getValue(0)【参考方案2】:

“问题”是“获取所有推文中不同单词的计数”与作为流处理器的 Strom 之间的不匹配。您要回答的查询只能在有限的推文集上计算。但是,在流处理中,您会处理潜在的无限输入数据流。

如果您有一组有限的推文,您可能想要使用批处理框架,例如 Flink、Spark 或 MapReduce。如果你确实有无数条推文,你必须重新表述你的问题......

正如您已经提到的,您实际上想要“遍历所有推文”。正如你这样流处理,没有这样的概念。您有无限数量的输入元组,Storm 在每个元组上应用execute()(即,您可以将其想象为 Storm 自动“循环输入”——即使在“循环”中不是正确的术语它)。由于您的计算是“所有推文”,您需要在 Bolt 代码中维护一个 状态,以便您可以为每个推文更新此状态。 Storm 中状态的简单形式将是 Bolt 类中的成员变量。

public class MyBolt implements ??? 
    // this is your "state" variable
    private final Set<String> allWords = new HashSet<String>();

    public void execute(TridentTuple tuple, TridentCollector collector) 
        Tweet tweet = (Tweet)tuple.getValue(0);        
        String tweetBody = tweet.getBody();
        String words[] = tweetBody.toLowerCase().split(regex);
        for(String w : words) 
            // as allWords is a set, you cannot add the same word twice
            // the second "add" call on the same word will just be ignored
           // thus, allWords will contain each word exactly once
            this.allWords.add(w);
        
    

现在,这段代码没有发出任何东西,因为不清楚你真正想要发出什么?与流处理一样,没有尽头,您不能说“发出最终的字数,包含在allWords 中”。您可以做什么,它会在每次更新后发出 当前计数...为此,请在 execute() 末尾添加 collector.emit(new Values(this.allWords.size()));

此外,我想补充一点,如果没有将并行性应用于 MyBolt,则所提出的解决方案只能正常工作——否则,实例上的不同集合可能包含相同的单词。为了解决这个问题,需要在无状态的 Bolt 中将每条推文标记为其单词,并将这些单词流放入采用内部 Set 作为状态的 MyBoltMyBolt 的输入数据还必须通过 fieldsGrouping 接收数据,以确保每个实例上的单词集不同。

【讨论】:

感谢您的出色回答,我有 50000 条推文,但不是无限的,我使用调试来了解代码如何获取推文,我在使用 getvalues 方法实现它之后通过方法执行得到它,然后发出转移到下一条推文等等..还有另一种计算方法,我现在将其发布在帖子中 如果要进行批处理,为什么要使用 Storm?我强烈建议使用像 Flink、Spark、MapReduce 这样的批处理系统......不过,我无法关注您的其余评论。 这个项目使用三叉戟实际上不是风暴,我发布了他计算集合中术语出现次数的方法,我只需要修改这个等式,所以我认为我不需要改变更多代码,是我错了还是我错了? Trident 只是 Storm 之上的一个 API 抽象,Storm 是底层执行引擎;因此,它仍然是流处理,似乎不适合您的批处理用例。 -- 我在这里无法提供任何其他帮助。

以上是关于每条推文中不重复的单词总数的主要内容,如果未能解决你的问题,请参考以下文章

第二周作业-词频统计

c_cpp 从一串单词中删除所有重复的单词。不只是重复,而是需要删除重复项的所有实例。

在 PHP 中查找重复的单词而不指定单词本身

不重复的单词组合

java 内容不重复的单词 set实现。

如何将每条推文分成不同的引导卡