2012-10-09 2 views
1

У меня есть набор обновлений статуса Twitter, и я пытаюсь отфильтровать все прямые сообщения, отправители и получатели последнего. В моем фрейме данных есть столбцы для отправителей и текст. Используя регулярные выражения, я пытаюсь фильтровать приемники из текстового столбца.R Regex для прямых сообщений на 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:[email protected] 

почему это то, что я получаю результаты длиннее 15 символов, используя {1,15}?

+0

Вы получите более полезные ответы, если вы предоставите [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – hadley

ответ

0

Ваша команда grep соответствует всем тем, что начинается с 1-15 буквенно-цифровых символов. Например:

@blahblahblahblahblahblahblahblahblah

будет соответствовать, потому что Grep ищет начало строки, ищет @, находит по крайней мере, один альфа-символ, а затем с удовольствием останавливается, рассматривая это успешный матч. grep не заботится о том, что происходит после вашего шаблона в строке, если он нашел что-то, которое соответствует.

Для того, чтобы получить только вещи до 15 символов, вы должны указать, что будет дальше:

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

Это соответствует 1-15 символов, за которыми следуют границы слова (\b, с дополнительными обратная косая черта для экранирования строки). Таким образом, оно не будет соответствовать слову длиной 16 или 100 символов - всего лишь от 1 до 15 символов.

+0

grep команда фактически была предназначена для соответствия всему тексту. его просто первый шаг, сокращающий мой набор данных для прямых сообщений. проблема в том, что команда gsub также сохраняет длительные результаты, даже если я указываю, что будет дальше (пробел). – supersambo

+0

@supersambo, извинения; Я неправильно понял этот вопрос. – dan1111

1

Оказалось, что это проблема с кодировкой. Я не смог решить эту проблему с помощью регулярных выражений, но у программного обеспечения, которое я использовал для получения твитов, есть столбец, который указывает, что идентификатор пользователя твиты присваивает адрес. Поэтому я буду использовать это для анализа.

Смежные вопросы