2016-08-05 19 views
-2

Rでハッシュタグ抽出関数を作成しようとしています。この関数は、投稿からハッシュタグを抽出します。あれば、空白を返します。私はRプログラミングのHashtag Extract関数

hashatag_extract(string) 

として、それを適用したいMy機能は

hashtag_extract= function(text){ 
       match = str_extract_all(text,"#\\S+") 
       if (match) { 
       return match 
       }else{ 
       return ''}} 
String="#letsdoit #Tonewbeginnign world is on a new#route 

のようなものです。しかし、私の機能が動作していない、私にerrors.like第一にエラーが

Error: unexpected symbol in: 
     " if (match) { 
    return match" 

あるのトンを示すと、答えは次のようになります

#letsdoit ##Tonewbeginnign #route 

そして最終的に私はサプリを使用してこの機能を列全体に適用します。そのため、If部分が重要です。 Rのための重要なわけではないので、Rのための私のインデントを無視するが、すべての提案は役に立ち

+1

質問は(SOに関連する)正確には何ですか?指定された関数が機能しないか、すべての場合にそうでないか、または "機能"が欠けていますか?質問に追加してください。ありがとう。 – Dilettant

+0

@docendodiscimusそれは重要でした。編集が完了しました –

+0

小さな例のつぶやきを追加すると便利です –

答えて

11
  1. ハッシュタグの正規表現が
  2. それほど単純ではありませんされます私はあなたがのために一般的に受け入れられている「ルール」を理解していないしてくださいハッシュタグ
  3. 私はstr_extract_all()あなたはそれだけでRLYツイート
  4. を分析停止する必要が stringr機能が
  5. 人々の上に構築されているstringiを使用
  6. と思われるもの戻っているとは思いません「

    get_tags <- function(x) { 
        # via http://stackoverflow.com/a/5768660/1457051 
        twitter_hashtag_regex <- "(^|[^&\\p{L}\\p{M}\\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7])(#|\uFF03)(?!\uFE0F|\u20E3)([\\p{L}\\p{M}\\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7]*[\\p{L}\\p{M}][\\p{L}\\p{M}\\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7]*)" 
        stringi::stri_match_all_regex(x, hashtag_regex) %>% 
        purrr::map(~.[,4]) %>% 
        purrr::flatten_chr() 
    
    } 
    
    tests <- c("#teste_teste  //underscore accepted", 
          "#teste-teste  //Hyphen not accepted", 
          "#leof_gfg.sdfsd //dot not accepted", 
          "#[email protected]#6fgh6 // @ not accepted", 
          "#leo#leo2#asd  //followed hastag without space ", 
          "#6663    // only number accepted", 
          "_#asd_   // hashtag can't start or finish with underscore", 
          "-#sdfsdf-   // hashtag can't start or finish with hyphen", 
          ".#sdfsdf.   // hashtag can't start or finish with dot", 
          "#leo_leo__leo__leo____leo // decline followed underline") 
    
    
    get_tags(tests) 
    ## [1] "teste_teste"    "teste"     
    ## [3] "leof_gfg"     "f34234"     
    ## [5] "leo"      NA       
    ## [7] NA       "sdfsdf"     
    ## [9] "sdfsdf"     "leo_leo__leo__leo____leo" 
    
    your_string <- "#letsdoit #Tonewbeginnign world is on a new#route" 
    
    get_tags(your_string) 
    ## [1] "letsdoit"  "Tonewbeginnign" 
    

    は、あなたは、各入力ベクトルにグループ化するハッシュタグの各セットが必要な場合は、機能を微調整する必要がありますが、あなたは本当にdidnの:

これは、全てではないが、例をほとんどを処理する必要がありますあなたが実際に成し遂げようとしていることについて多くの詳細を提供します。

+0

ありがとうございます。しかし、str_extract_allは私のために本当にうまくいっています。でも、plsが私の機能を助けてくれます。 –

+1

あなたはこの答えで必要なものすべてを持っているはずです。あなたの要件を満たしていない場合、私はそれを喜んで削除します。 – hrbrmstr

+0

'map'と' flatten_chr'の素晴らしいワークフロー。私は、プレースホルダではなく '.x'が' map(〜.x [、4]) 'のように必須であると思っていました。お気軽に – aurelien

1

@manu sharma私はあなたが他の場合は内部に適用する必要はないと言います。一致しない行が 'NA'として値をとるようにします。関数を適用した後、それを空白に変更します。 は私のコードがあなたのお役に立てば幸いです:

aaa <- readLines("C:\\MY_FOLDER\\NOI\\file2sample.txt") 
ttt <- function(x){ 

    r <- sapply(x, function(x) { matches <- str_match(x,"#\\w+\\s+")}) 
    r 


    } 

y <-ttt(aaa) 
y[is.na(y)]='' 
0

すべてのヘルプのおかげでみんな、私はそれが何らかの形で働いていました、それはメッセージ

message[is.na(message)]='abc' 

上のすべてのNASを1.replacing Shaliniの答え とほぼ似ていると思いました全カラムに関数を適用しハッシュタグ

hashtag_extrac= function(text){ 
match = str_extract_all(text,"#\\S+") 
if (match!= "") { 
match 
} else { 
'' }} 

を抽出する2.function 0
hashtags= sapply(message, hashtag_extrac) 

+0

なぜif文ですか?それは何もしません...空でないなら、何もしないでください。空白の場合は空白にします。私は上記のはるかに高い品質の答えを使用しない理由がわかりません。 – cory

+0

ありがとうございました!しかし、私は依頼しても、スクリプトでも、私たちは独自のケースと用途を持っており、時には説明することができず、確かに彼らはより良い答えになるでしょう。 –

+0

あなたは@ Shaliniの答えを受け入れる - 私はそれを理解するそれとも、私はそれを誤読しましたか? – Dilettant

関連する問題