2016-08-05 8 views
-2

Ich versuche, eine Hashtag-Extraktionsfunktion in R zu erstellen. Diese Funktion wird eine Hashtag aus einem Post extrahieren, wenn es irgendwelche gibt, sonst wird ein Leerzeichen geben. Meine Funktion ist wieHashtag Extract-Funktion in R Programmierung

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 

Aber meine Funktion funktioniert nicht, mich Tonnen errors.like ersten Fehler zeigt,

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

so dass ich es als

hashatag_extract(string) 

anwenden möchten, und Antwort sollte kommen wie

#letsdoit ##Tonewbeginnign #route 

Und schließlich werde ich sapply verwenden, um diese Funktion auf die ganze Spalte anzuwenden, deshalb ist der If-Teil wichtig. Bitte ignorieren Sie meine Einbuchtung für R, da ihr nicht wichtig für R, aber jeder Vorschlag hilfreich sein

+1

Was genau ist die Frage (relevant hier bei SO)? Funktioniert die angegebene Funktion nicht oder nicht in allen Fällen oder fehlen "Features"? Bitte fügen Sie die Frage hinzu. Vielen Dank. – Dilettant

+0

@docendodiscimus Es war wichtig. Edits done –

+0

Hinzufügen eines kleinen Beispiel Tweet wäre hilfreich –

Antwort

11
  1. Hashtag reguläre Ausdrücke sind nicht so einfach
  2. Ich bin nicht sicher Sie die allgemein anerkannten „Regeln“ zu verstehen für
  3. Hashtags
  4. ich glaube nicht, str_extract_all() zurückkehrt, was Sie denken, es ist
  5. Nur stringi verwenden, die stringr Funktionen auf gebaut von
  6. Folks rly stoppen müssen Tweets Analyse

Dies sollte die meisten, wenn nicht alle Fälle behandeln:

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" 

Sie müssen die Funktion optimieren, wenn Sie jeden Satz von Hashtags müssen mit jedem Eingangsvektor gruppiert werden, aber du wirklich didn‘ Ich gebe viel Details darüber, was Sie wirklich erreichen wollen.

+0

Vielen Dank dafür. Obwohl str_extract_all funktioniert wirklich gut für mich, noch, bitte helfen Sie mir mit meiner Funktion –

+1

Sie sollten alles, was Sie brauchen, mit dieser Antwort. Ich werde es gerne löschen, wenn es nicht Ihren Anforderungen entspricht. – hrbrmstr

+0

schöner Workflow von 'map' und' flatten_chr'. Ich dachte, die '.x' anstelle des Platzhalters war obligatorisch wie' map (~ .x [, 4]) '. Gut zu wissen – aurelien

1

@manu sharma Ich würde sagen, Sie müssen nicht gelten, wenn sonst drinnen. Lassen Sie die nicht übereinstimmenden Zeilen Werte als 'NA' annehmen. Und nach dem Anwenden der Funktion ändern Sie es auf leer. Hoffnung meinen Code hilft Ihnen:

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

Danke an alle für die Hilfe, ich habe es irgendwie funktionierte, dachte, es als Shalini Antwort fast ähnlich ist 1.replacing alle NAs auf Nachricht

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

2.Function für die Hashtags Extrahieren

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

Anwendung-Funktion auf ganze Spalte

hashtags= sapply(message, hashtag_extrac) 
+0

Warum ist das, wenn Aussage dort? Es tut nichts ... Wenn es nicht leer ist, dann tu nichts. Wenn es leer ist, mache es leer. Ich bin verblüfft, warum Sie nicht die höhere Antwort höherer Qualität oben verwenden. – cory

+0

Vielen Dank! Aber ich werde bitten, ruhig zu bleiben, auch in Skripten, wir haben unsere eigenen Fälle und Verwendungen, die wir manchmal nicht erklären können in einer que und sicherlich sind sie bessere Antworten –

+0

So akzeptieren Sie @ Shalini's Antwort - ich verstehe es so oder habe ich es falsch verstanden? – Dilettant

Verwandte Themen