2016-08-05 3 views
-2

Я пытаюсь создать функцию извлечения хэштегов в R. Эта функция будет извлекать хэштеги из сообщения, если они есть, else даст пустой. Моя функция какHashtag Extract function in R Programming

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 1 ошибки

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

, поэтому я хочу, чтобы применить его в качестве

hashatag_extract(string) 

и ответ должен наступить как

#letsdoit ##Tonewbeginnign #route 

И в конце концов я буду использовать sapply, чтобы применить эту функцию ко всему столбцу, поэтому важна часть If. Пожалуйста, игнорируйте мой отступы для R, так как его не имеет значения для R, но каждое предложение будет полезным

+1

В чем конкретно заключается вопрос (см. Здесь в формате SO)? Не работает ли данная функция или не во всех случаях, или отсутствуют ли функции «функции»? добавьте к вопросу. Благодарю. – Dilettant

+0

@docendodiscimus Было важно. Сделано редактирование –

+0

Добавление небольшого примера твита было бы полезно –

ответ

11
  1. хэштегом регулярные выражения не так просто
  2. Я не уверен, что вы понимаете общепринятые «правила» для Хештеги
  3. Я не верю str_extract_all() возвращается то, что вы думаете, это
  4. Просто используйте stringi, которые stringr функции построены на вершине
  5. Folks Rly необходимо прекратить анализировать твиты

Это должно работать с большинством, если не все, случаи:

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" 

Вам необходимо настроить функцию, если нужно каждый набор хэштегов быть сгруппированы с каждого входного вектора, но вы действительно Ждут» t подробно расскажите о том, что вы действительно пытаетесь выполнить.

+0

Большое вам спасибо за это. Хотя, str_extract_all работает очень хорошо для меня, Тем не менее, PLS помочь мне с моей функцией –

+1

у вас должно быть все, что вам нужно с этим ответом. я с удовольствием удалю его, если он не соответствует вашим требованиям. – hrbrmstr

+0

приятный рабочий процесс 'map' и' flatten_chr'. Я подумал, что вместо «placeholder» вместо «placeholder» был указан «.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

Спасибо всем за помощь, я получил это работало как-то, думал, что это почти подобно тому, как ответ Шалини в 1.replacing все Nas на сообщение

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

2.Function для извлечения Hashtags

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

применяя функцию на всей колонке

hashtags= sapply(message, hashtag_extrac) 
+0

Почему это утверждение есть? Он ничего не делает ... Если это не пусто, тогда ничего не делайте. Если он пуст, сделайте его пустым. Я не понимаю, почему вы не используете гораздо более качественный ответ выше. – cory

+0

Большое вам спасибо! Но я буду просить, сохранять спокойствие, даже в сценариях, у нас есть свои собственные случаи и использования, которые иногда мы не можем объяснить в que, и, конечно, они лучше отвечают –

+0

Итак, вы принимаете ответ @ Shalini - я это понимаю таким образом, или я неправильно понял его? – Dilettant