每条推文中不重复的单词总数
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
作为状态的 MyBolt
。 MyBolt
的输入数据还必须通过 fieldsGrouping
接收数据,以确保每个实例上的单词集不同。
【讨论】:
感谢您的出色回答,我有 50000 条推文,但不是无限的,我使用调试来了解代码如何获取推文,我在使用 getvalues 方法实现它之后通过方法执行得到它,然后发出转移到下一条推文等等..还有另一种计算方法,我现在将其发布在帖子中 如果要进行批处理,为什么要使用 Storm?我强烈建议使用像 Flink、Spark、MapReduce 这样的批处理系统......不过,我无法关注您的其余评论。 这个项目使用三叉戟实际上不是风暴,我发布了他计算集合中术语出现次数的方法,我只需要修改这个等式,所以我认为我不需要改变更多代码,是我错了还是我错了? Trident 只是 Storm 之上的一个 API 抽象,Storm 是底层执行引擎;因此,它仍然是流处理,似乎不适合您的批处理用例。 -- 我在这里无法提供任何其他帮助。以上是关于每条推文中不重复的单词总数的主要内容,如果未能解决你的问题,请参考以下文章