Extrahieren ganzer Wörter

7

Ich habe eine große Menge realen Text, aus dem ich Worte ziehen muss, um sie in eine Rechtschreibprüfung einzugeben. Ich möchte so viele aussagekräftige Wörter wie möglich ohne zu viel Rauschen extrahieren. Ich weiß, dass es hier viele Regex-Ninjas gibt, also hoffentlich kann mir jemand helfen.

Momentan extrahiere ich alle alphabetischen Sequenzen mit '[a-z]+' . Das ist eine gute Näherung, aber es bringt viel Müll mit sich.

Idealerweise Ich möchte eine Regex (muss nicht hübsch oder effizient sein), die alle alphabetischen Sequenzen extrahiert, die durch natürliche Worttrennzeichen (wie [/-_,.: ] usw.) begrenzt sind, und ignoriert alle alphabetische Sequenzen mit unzulässigen Schranken.

Ich würde aber auch gerne alle alphabetischen Sequenzen bekommen, die NICHT an eine Nummer angrenzen. So würde beispielsweise 'pie21' NICHT 'pie' extrahieren, aber 'http://foo.com' würde ['http', 'foo', 'com'] extrahieren.

Ich habe lookahead und lookbehind Assertions versucht, aber sie wurden pro Zeichen angewendet (also würde zB re.findall('(?<!\d)[a-z]+(?!\d)', 'pie21') 'pi' zurückgeben, wenn ich möchte, dass nichts zurückgegeben wird). Ich habe versucht, den Alphateil als Ausdruck zu verwenden ( (?:[a-z]+) ), aber es hat nicht geholfen.

Mehr Details: Die Daten sind eine E-Mail-Datenbank, daher ist es meistens normales Englisch mit normalen Zahlen, aber gelegentlich gibt es Abfallzeichenfolgen wie GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA und AC7A21C0 , die ich komplett ignorieren möchte . Ich nehme an, dass jede alphabetische Sequenz mit einer Zahl darin Unsinn ist.

    
orlade 19.04.2011, 14:22
quelle

4 Antworten

16

Wenn Sie sich auf ASCII-Buchstaben beschränken, verwenden Sie (mit der Option re.I )

%Vor%

\b ist ein Wortgrenzenanker, der nur am Anfang und am Ende von alphanumerischen "Wörtern" übereinstimmt. Also stimmt \b[a-z]+\b mit pie überein, aber nicht mit pie21 oder 21pie .

Um auch andere Nicht-ASCII-Buchstaben zuzulassen, können Sie etwas wie folgt verwenden:

%Vor%

, die auch Zeichen mit Akzent usw. erlaubt. Möglicherweise müssen Sie die Option re.UNICODE festlegen, insbesondere wenn Sie Python 2 verwenden, damit die Kurzschrift \w mit Nicht-ASCII-Buchstaben übereinstimmen kann.

[^\W\d_] als negierte Zeichenklasse erlaubt jedes alphanumerische Zeichen außer Ziffern und Unterstrichen.

    
Tim Pietzcker 19.04.2011, 14:25
quelle
3

Kennen Sie Wortgrenzen? ( \b ). Sie können Wörter mit dem \b um die Sequenz herum extrahieren und das Alphabet innerhalb von:

abgleichen %Vor%

Zum Beispiel wird dies ganze Wörter aufnehmen, aber an Token wie Bindestrichen, Punkten, Semikolons, etc. aufhören.

Sie können die \b -Sequenz und andere im Python-Handbuch

finden

BEARBEITEN Wenn Sie nach einer Zahl suchen, die der Übereinstimmung folgt oder ihr vorausgeht, können Sie auch eine negative Vorausschau verwenden:

%Vor%     
Brad Christie 19.04.2011 14:26
quelle
2

Was ist mit:

%Vor%

Beachten Sie Folgendes:

  • split explodiert Ihre Zeichenfolge in potenzielle Kandidaten = & gt; gibt eine Liste von "potenziellen Wörtern"
  • zurück
  • set macht Unicity-Filterung = & gt; transformiert die Liste in Menge und entfernt dadurch Einträge, die mehr als einmal vorkommen. Dieser Schritt ist nicht obligatorisch.
  • filter reduziert die Anzahl der Kandidaten: nimmt eine Liste, wendet eine Testfunktion auf jedes Element an und gibt eine Liste des Elements zurück, das dem Test folgt. In unserem Fall ist die Testfunktion "anonym"
  • Lambda: anonyme Funktion, die einen Gegenstand nimmt und überprüft, ob es ein Wort ist (nur obere oder untere Buchstaben)

BEARBEITEN : einige Erklärungen hinzugefügt

    
Bruce 19.04.2011 14:32
quelle
0

Beispielcode

%Vor%

oder

%Vor%     
Alexander Lubyagin 06.12.2017 10:44
quelle