1

我必须收集随机选择的一大组(3000-5000)推文进行手动注释,但我有一些限制:

  1. 所有推文都必须附有图片;
  2. 不允许重复推文;
  3. 我需要诸如评论之类的信息,因此在发布时间后几秒钟将它们拿走是没有用的,
  4. 我必须用 Java 处理我的数据,所以我打算使用 Twitter4J 或 Hosebird 客户端。
  5. 可能,推文必须随机选择,不指定任何标签(如“食物”或“运动”)。

我使用 Hosebird 客户端创建了一个 Stream 并用推文填充了一个 BlockingQueue,但是这样我不遵守限制 3 和 5。

另一方面,使用 Twitter4J,使用类 Query,我无法找到同时尊重 1 到 5 的解决方案。

我觉得使用队列将帮助我解决重复推文的问题,但我并没有成功尊重我的所有先决条件。

我的问题是:是否可以尊重我对 twitter4j 或 HBC 的所有限制?如果是,有人可以给我一些代码或建议吗?

谢谢

4

1 回答 1

3

我认为 twitter4j 足以满足你的所有条件。您可以在 twitter4J 中使用流媒体。如果你不给它一个过滤参数,它会给你一个推文流。例如;

条件 1)当您从流媒体中获取推文时,您可以查看 media_entity 部分以检查是否存在至少一个媒体对象并且其类型为图像。如果是这样,您可以将其保存在任何数据库的表中。

例如:

 MediaEntity[] mediaEntities = status.getMediaEntities();

       for (MediaEntity mediaEntity : mediaEntities)
               if (mediaEntity.getType() == "photo")
               {
                  // Save status object which has the tweet and its metadata

                break;
               }

条件2)每条推文都有一个唯一的推文ID,另一件事是流应用程序不能为同一条推文点击两次。但是,如果您独立运行两个不同的流媒体应用程序,则这两个应用程序可能会点击相同的推文。即使您运行两个应用程序,您也可以在保存之前检查数据库表中的推文 ID。

条件3)(详细说明你的意思!)据我所知,Twitter 中还没有像 Facebook 那样的评论机制。如果您指的是转推,您可以使用 Twitter4J 的另一个应用程序同时搜索特定推文的转推。

条件 4)我不知道 Hosebird 客户端系统,但我知道并经常使用 Twitter4J。我可以说 Twitter4J 是一个纯粹的基于 Java 的系统。您需要使用的只是添加 jar 文件作为对您的 java 应用程序的引用,它就可以使用了。这很简单。

条件 5)我为我的流媒体应用程序提供了一组关键字,以捕获包含特定关键字或主题标签的推文。在您的情况下,您可能不提供任何参数,这意味着流应用程序将在没有任何条件的情况下捕获所有推文。为此,可以以我的过滤机制为例:

 FilterQuery fq = new FilterQuery();
  String keywords[] = {"sport", "politics", "health"}; //etc..

  fq.track(keywords);

  twitterStream.addListener(statusListener);
  twitterStream.filter(fq);

最后,我在下面粘贴了一个完整的 java 方法,说明如何使用它作为示例。我希望它对你有帮助。:D

  private static void GetTweetStreamForKeywords()
        {
        TwitterStream twitterStream = new TwitterStreamFactory(config).getInstance();

        StatusListener statusListener = new StatusListener() {

         @Override
         public void onStatus(Status status) {
           // The main section that you get the tweet. You can access it by status object.
           // You can save it in a database table.
         }


                @Override
                public void onDeletionNotice(StatusDeletionNotice sdn) {
                    throw new UnsupportedOperationException("Not supported yet."); 
                }

                @Override
                public void onTrackLimitationNotice(int i) {
                    throw new UnsupportedOperationException("Not supported yet."); 
                }

                @Override
                public void onScrubGeo(long l, long l1) {
                    throw new UnsupportedOperationException("Not supported yet."); 
                }

                @Override
                public void onStallWarning(StallWarning sw) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }

                @Override
                public void onException(Exception ex) {
                    logWriter.WriteErrorLog(ex, "onException()");
                }
            };

            FilterQuery fq = new FilterQuery();        

            String keywords[] = {"sport", "politics", "health"};

            fq.track(keywords);        

            twitterStream.addListener(statusListener);
            twitterStream.filter(fq);          
      }   
于 2014-01-25T22:07:44.397 回答