清理推文并在数据库中存储每日推文

时间:2015-11-29 12:22:07

标签: java twitter twitter4j sentiment-analysis data-cleaning

我正在尝试确定关于推文的电视剧收视率。因此,我有一个Twitter数据,包括推文,提及,ArrayLists中的主题标签,通过使用Java与Twitter4J库分开。 我的目的是首先清理推文,然后使用自然语言处理进行分析。 在清理阶段,存在重复的推文,例如来自不同用户的转推以及来自一个用户的多个推文,应该进行清理。 在分析阶段,我将使用一个NLP库来解析根,以便能够确定评级。到目前为止,我已经编写了这段代码:

public static void main(String[] args) {
    // TODO Auto-generated method stub

    new TwitterApplication().retrieve();

}

public void retrieve(){
    logger.info("Retrieving tweets...");
    ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.setOAuthConsumerKey(CONSUMER_KEY);
    builder.setOAuthConsumerSecret(CONSUMER_SECRET);
    Configuration configuration = builder.build();
    TwitterFactory factory = new TwitterFactory(configuration);
    Twitter twitter = factory.getInstance();

    ArrayList<String> tweetList = new ArrayList<String>();
    ArrayList<String> hashtagList = new ArrayList<String>();
    ArrayList<String> mentionList = new ArrayList<String>();

    Query query = new Query("The Walking Dead");

    Date date=new Date();
    String modifiedDate= new SimpleDateFormat("2015-11-25").format(date);
    String modifiedDate2= new SimpleDateFormat("2015-11-26" ).format(date);
    query.setSince(modifiedDate);
    query.setUntil(modifiedDate2);


    query.lang("en");
    query.setCount(100);

    System.out.println("key:" + twitter.getConfiguration().getOAuthConsumerKey());
    System.out.println("secret: " + twitter.getConfiguration().getOAuthConsumerSecret());
    AccessToken accessToken = new AccessToken("**************", "***********");

    twitter.setOAuthAccessToken(accessToken);

    try {

    QueryResult result = twitter.search(query);

    System.out.println("Count : " + result.getTweets().size()) ;        

    for (Status tweet : result.getTweets()) {           

    for(HashtagEntity hashtag : tweet.getHashtagEntities()){
        //System.out.println(hashtag);
        hashtagList.add(hashtag.getText().toString());
    }

    for(UserMentionEntity mention : tweet.getUserMentionEntities()){
        mentionList.add(mention.getScreenName().toString());
    }



    //try to fetch only one of the retweets, but it doesn't work        
    /*  
    int once=0;
    if(tweet.isRetweeted() && once==0)
    {
    tweetList.add(tweet.getText());
    once++;
    } 
    */

    tweetList.add(tweet.getText());


    }

    } catch (TwitterException e) {

    e.printStackTrace();
    System.out.println("Failed to search tweets" + e.getMessage());

    }

    System.out.println("Tweets:");
    for(String t :tweetList){
        System.out.println(t);
    }

    System.out.println("Hashtags:");
    for(String h:hashtagList){
        System.out.println( h);
    } 

    System.out.println("Mentions:");
    for(String m:mentionList){
        System.out.println(m);
    } 



    logger.info("done! ");

}

正如您所见,我使用ArrayLists暂时存储它们。我想问的是,在清理阶段之后我应该将它们存储在MySQL,MongoDB等数据库中吗?如果我应该,我怎样才能有效地存储它们?考虑到我将稍后分析(根据情绪分析获得根据并给出积分)推文。

1 个答案:

答案 0 :(得分:1)

存储与否的问题主要取决于您计划在事后对数据做什么。通常因为在推文上使用NLP(标记化,删除停用词,词干等)可能需要一些时间,因此存储处理过的数据可能是明智之举。但是,如果您只需要一次数据并在其上计算一些指标,则可能根本不需要存储它。

如果您希望将来处理对已处理数据的查询,例如&#34;请给我在日期X&#34;之前发布的所有处理过的推文,我建议您使用存储此信息的数据库。 值得一看的是hibernate,它提供了一种简单而有条理的方式来与数据库交谈。如果推文量很大(以百万计),您将需要寻找可扩展的数据库(但是现在大多数大型数据库都提供此功能)。

如果您不需要处理已处理推文的查询,您也可以将它们存储到XML / JSON文件中,这可能更容易。