2012-01-13 4 views
3

私は様々なつぶやきの単語、名前、ハッシュタグ、フレーズを整理するために、Twitterフィードを使用しています。つぶやきから単語、名前、ハッシュタグ、フレーズを抽出する正規表現

私は名前が大文字で始まり、ハッシュタグは#の後ろに空白があり、フレーズは引用符で囲まれたものであり、単語は単語であると仮定しています。

リンクを引き出すのもいいですが、それは必要ではありません。

私はRegexを使用したいと思いますが、より良い解決策があれば、私は知りたいと思います。

たとえばTwitterのポスト:

あなたは彼の新しいトレーラーを見て、考えるとき、あなたはウェス・アンダーソンの映画をたくさん見て知っている「フューチュラフォントだところ、待って?」 http://bit.ly/HklUk #MoviesILike

Wes AndersonWait, where's the Futura font?#MoviesILikeを分割う、と

正規表現は、私は今で遊んでいた単語

のすべてがある:

Regex _wordRegex = new Regex(@"(?:\""(?<Item>.*?)\"")|(?<Item>(?:[A-Z][a-z]*?[.\s])+)|(?<Item>#\S+)|(?<Item>\w+)"); 
+1

有用なTwitterフィードの例を投稿してください。 – Standage

+0

@Paul - 申し訳ありませんが、誰もがTwitterの投稿に精通していると思っていました。 CodeInChaos - 私の試行の1つを追加しました –

答えて

4

私が扱ってきた私ツイッターデータの公正な共有。私は最良の方法は、空白文字でメッセージ文字列をトークン化し、各トークンを分析することであることがわかりました。これはかなりうまく機能...のは例を見てみましょう:@#トークンの

@bobjones let's go watch the game at @hooters #nfl #broncos #tebow 

を、あなただけの最初の文字をチェックする必要があります。 URLの場合は、そこにregexを使って何かしたいことがあります。基本的に:

if token[0] == '@' then mention 
else if token[0] == '#' then hashtag 
else if token looks like a url then url 
else then word 

このケースでは、私の意見では、複雑にする必要はありません。特に、同じ文字列からさまざまな種類のものを抽出することを目指しているからです。

あなたは引用符で囲んでいることを言います...トークン化のコーナーケースとして扱うことをお勧めします。

+0

答えをありがとう! Tokenizerは私が思うに少し過剰です。これは、TwitterのデータからシンプルなWord Cloudアプリケーションです。他にすべてが失敗した場合、それは私の核心の選択肢になります:) +1 –

+0

空白をトークン化することは、正規表現IMOよりもはるかに少ないです: –

+1

@orangeoctopusさらに、読みやすく、脆くないという利点があります。わーい! –

0

上記の答えは、空白で文字列をトークン化し、ハッシュタグを探しているトークンを繰り返していることが、ハッシュタグに対して句読点やその他の奇妙な文字がない場合にのみ正確に機能することがわかりました。たとえば、I like #programmingは正常にトークン化できましたが、I like #programming, right?は正しく識別されないハッシュタグになります。#programming,

この問題を処理するにはいくつかの方法があります。私は順番に各キャラクターを見る反復的なアプローチを提案します。それは遅くなりますが、より正確です。

string raw = "hello this is #Totally #Awesome, right? #yeah!"; 
List<string> hashtags = new List<string>(); 
StringBuilder sb = null; 

foreach (char c in raw.ToLower()) 
{ 
    if (c == '#') 
    { 
     sb = new StringBuilder(); 
     track = true; 
    } 
    else if (track) 
    { 
     if (char.IsLetterOrDigit(c)) 
     { 
      sb.Append(c); 
     } 
     else 
     { 
      hashtags.Add(sb.ToString()); 
      track = false; 
     } 
    } 
} 

if (track) 
{ 
    hashtags.Add(sb.ToString()); // Make sure to grab the last one! 
} 

それは(あなたは#######か何かで終わるしないでください良いです)のハッシュ記号を取り除いていますが、完全に

を取得する必要があり、素晴らしい、ええ

関連する問題