2016-04-03 14 views
0

Ich versuche, allgemeine Wörter (Konjunktionen, Adverbien, Pronomen, usw.) von einem Block des Textes zu entfernen. Ich verwende eine Regex, aber aus irgendeinem Grund werden einige der gebräuchlichen Wörter in meinem Filter nicht herausgefiltert.RegEx Filter für allgemeine Wörter

Einige Beispiele von Wörtern nicht gefiltert werden: "havent", "Warum", "sollte"

Irgendwelche Ideen, warum?

splitResult = s.split() 
     p = re.compile(
      """^(&|also|a|about|again|all|after|are(nt)?|arent|as|an(y)?|at| 
       bcuz|before|be(low)?|between|bring|but|by|and|can(not)?|close(d)?|could(nt)?| 
       cuz|do(nt)?|down|decide(d)?|decision|on(to)?|or|of|our|over|out|have(nt)?|he(re)?| 
       her|his|other(s)?|even|got(ten)?|for|from|get(s)?|got(ten)?|has(nt)?|havent|he(s)?| 
       him|his|if|in|to|in(to)?|is(nt)?||make|me|once|play(ed)?|role|say(s)?|seen|she(s)?| 
       should(nt)?|stop(ped)?|time|my|no(t)?|must(nt)?|now|you(re)?|your|want|want(ed)?| 
       watch(ed)?|way|we(re)?|will|with||i|a|is(nt)?|just|would(nt)?|before|that|the(re)?| 
       their|them|they|this|turn|when|at|how|it(s)?|which|who|after|then|if|how|because|know(s)?| 
       yet|[A-Za-z]{1,2}|http(s)?://.*|www\..*)$""",re.I) 

     for word in splitResult: 
      m = p.findall(word) 
      if not m: 
       word = "".join(c for c in word if c not in ("?", ".", "!", '"', ",","'","(",")")) 
       wordsList.insert(ctr,word) 
+1

Ich denke, das eine geeignetere Job für Maschinelle Sprachverarbeitung, siehe zum Beispiel: http://stackoverflow.com/questions/9953619/technique-to-remove-common-words-and-their-plural-versions-from-a-string. – alecxe

+0

Ich habe dies in [Regex101] (https://regex101.com/r/wR0dJ2/1), und Sie können den Fehler im Abschnitt * Erklärung * sehen (obwohl es nicht hervorhebt). Im Grunde hast du "is (nt)? || make", was "is (nt)? || make" und "with || i" sein soll, was "mit | i" sein soll. Beide hatten 2 '||' anstelle von 1. Dies löst das Problem nicht, aber ich würde vorschlagen, dass Sie Ihre RegEx aktualisieren – Druzion

+0

Ich konnte kein Problem finden, ich habe gerade Capturing-Gruppen auf Nicht-Capturing für eine sauberere Ausgabe gedreht: siehe [ Demo] (http://ideone.com/mnC7nr). Beachten Sie, dass Sie dieses Muster stärker kontrahieren können, um es effizienter zu gestalten, indem Sie Keywords mit gemeinsamen Endungen gruppieren. –

Antwort

0

Ihr Muster nicht über why als eine seiner Abwechslungen.

Es scheint, dass Ihr Muster so groß geworden ist, dass Sie es nicht mehr verwalten können.

Ihr Muster stimmt nicht überein, wenn umgebende Leerzeichen oder Apostrophe vorhanden sind.

Es gibt keinen Grund, dass havent und should nicht filtern können, andernfalls. Ohne mehr Code weiß niemand.

(Im Folgenden ist ein Fehler in regex101.com, aber Sie sollten dennoch Ihre Regex entsprechend beheben.)

Nach regex101.com gibt es zwei der folgenden Fehler:

| Alternator das bedeutet, es gibt || s in Ihrem Code, im wesentlichen an dieser Stelle effektiv die Gruppe abschneidet, alle anderen Tokens über diesen Punkt hinaus nutzlos

Rendering.

Hinweis: Wenn Sie das Nichts (das Äquivalent einer leeren Zeichenfolge) anpassen möchten, sollten Sie keine Änderungen vornehmen, da diese Regex-Engine mit dem frühesten Wechsel übereinstimmt.

Hier sind sie:

  • ||make
  • |with||i

(Gefunden mit der Regex: \|\|)

+0

Das ist ein schöner Fang. Die Fehlermeldung, hiwever, könnte verbessert werden :) Ein doppeltes '||' lässt die Regex 'nichts' zu, an diesem Punkt - es schneidet nicht wirklich ab. (Nun, es tut, aber alle innerhalb der Regeln.) – usr2564301

+0

@RadLexus Ich habe diese Formulierung nicht gewählt. Sag 'regex101.com' das. – Laurel

+0

Ich erkenne das || Ich dachte nur daran, das Problem zu erklären. – usr2564301

Verwandte Themen