1

私は一連の Twitter ステータス更新を取得し、すべてのダイレクト メッセージ、後者の送信者と受信者をフィルタリングしようとしています。私のデータフレームには、送信者とテキストの列が含まれています。正規表現を使用して、受信者をテキスト列から除外しようとしています。

これは私が得たものですが、いくつかの奇妙な結果を返します

   WD <- getwd()
   if (!is.null(WD)) setwd(WD)

   load("data.R")
   #http://www.unet.univie.ac.at/~a0406222/data.R

   dmtext <- grep("^@[a-z0-9_]{1,15}", tweets$text, perl=T, value=TRUE,ignore.case=TRUE)
   dm.receiver <- gsub("^@([a-z0-9_]{1,15})[ :,].*$", "\\1", dmtext, perl=T,ignore.case=TRUE)
   dm.sender <- as.character(tweets$from_user[grep("^@[a-z0-9_]{1,15}", tweets$text,       perl=T,ignore.case=TRUE,value=FALSE)])


   dm.df <- data.frame(dm.sender,dm.receiver,dmtext)

   dm.df[1:1000,2]

これらは、dm.receiver で得られる悪い結果の例です。

    @insultaofuturo Apesar da proibição, jovens insistem em acampar no Aterro na Rio+20\nhttp://t.co/dCfFHUWV
    @mqtodd Bringing the .green Internet to Rio+20 Summit | DotGreen\nhttp://t.co/pQqYilXp #RioPlus20 #gogreen
    @Shyman33 Elinor Ostrom's trailblazing commons research can inspire Rio+20\n http://t.co/m7OTHBtP
    @OccupyRio20 @pnud_es @FBuenAbad @rioplussocial #Futurewewant \nALGO DE ESTO SE HA CUMPLIDO? http://t.co/QDlVwT5z
    @UNDP_CDG#UNDP#Asia-Pacific#Rio+20E-discussion on National&amp;Local Planning for Sustainable Development. Contribute&amp;mail:aprc.rio20@undp.org

{1,15} を使用すると 15 文字を超える結果が得られるのはなぜですか?

4

2 に答える 2

1

エンコードの問題であることが判明しました。正規表現を使用してこの問題を解決することはできませんでしたが、ツイートを取得するために使用したソフトウェアには、宛先のユーザー ID ツイートを示す列があります。なので、これを使って分析します。

于 2012-10-09T21:08:09.580 に答える
0

コマンドは、 1〜15 文字の英数字で始まるgrepものと一致します。例えば:

@blahblahblahblahblahblahblahblahblah

grepは行の先頭を探し、@を探し、少なくとも1つの英字を見つけてから、これが成功したと見なして喜んで停止するため、一致します。grepは、一致するものが見つかった場合に限り、文字列内のパターンの後に何が来るかを気にしません。

15文字未満のものだけを取得するには、次に来るものも指定する必要があります。

dmtext <- grep("^@[a-z0-9_]{1,15}\\b", ...

これは1〜15文字に一致し、その後に単語の境界が続きます(\b、文字列をエスケープするための余分な円記号が続きます)。したがって、16文字または100文字の長さの単語とは一致せず、1〜15文字の単語とのみ一致します。

于 2012-10-09T12:29:28.180 に答える