2017-09-08 2 views
0

Ich habe einen Satz begrenzen: mit /NNP TagWie Textextraktion bis bestimmten Zeichen mit regex und Python

text = "Alun-alun/NNP Jombang/NNP tepatnya/RB Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP pagi/NN :/: :/: :/: Minggu/NNP" 

Ich mag /IN bis letztem Wort jedes Wort von Tag extrahieren.

Der Code so weit kann die Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP pagi/NN :/: :/: :/: Minggu/NNP extrahieren. Aber ich möchte, dass es aufhört, wenn der Code entweder /: oder /IN Tag erfüllt. Hier ist der Code so weit:

import re 

def entityExtract(text): 
    # text = re.findall(r'([^\s/]*/IN\b[^/]*(?:/(?!IN\b)[^/]*)*/NNP\b)', text) 
    text = re.findall(r'([^\s/]*/IN\b[^/]*(?:/(?!IN\b)[^/]*)*/(?:NNP|CDP)\b)', text) 
    return text 

text = "Alun-alun/NNP Jombang/NNP tepatnya/RB Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP pagi/NN :/: :/: :/: Minggu/NNP" 

extract = entityExtract(text) 

print text 
print extract 

Ausgang:

['Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP pagi/NN :/: :/: :/: Minggu/NNP'] 

Erwartetes Ergebnis ist:

['Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP] 

Was ist der beste Weg, es zu lösen?

+1

Ihr erwartetes Ergebnis stimmt nicht mit Ihrer Problemdefinition überein. Sie sagen, dass Sie ein beliebiges Wort nach Tag/IN bis zu einem Wort mit/NNP-Tag extrahieren möchten. ''Depan/IN'' ist _nicht_ nach dem Tag'/IN' und sollte nicht enthalten sein. ''SMP/NNP'' ist ein Wort mit'/NNP'-Tag und sollte auch nicht enthalten sein. Die erwarteten Ergebnisse müssen eine leere Zeichenfolge sein. Bitte nochmal nachprüfen. – DyZ

+0

@DYZ danke für die Korrektur, ich habe meine Frage behoben. Ich hoffe, dass alle meinen Standpunkt verstehen. – ytomo

+0

Ich habe die Frage bearbeitet, um einige der Verwirrungen zu beheben, die noch existierten. Wenn es in Ordnung ist, akzeptiere Änderungen, thx! – kaza

Antwort

2

[^\s/]*/IN\b([^/]*/(?!IN\b|:\b)[^\s^/]*\b)*[^/]*/NNP\b

Am so verwirrt wie @DYZ darüber, wo Sie aufhören wollen, so basierte ich meinen Regex auf Ihrer Ausgabe.
Ich glaube, Sie wollen 'word/tag' Abschnitte der Zeichenfolge extrahieren und word+tag sind stark gekoppelt.

Wo Sie Ihren Tag stoppen zu wollen, ohne einschließlich wird von dieser Gruppe gesteuert (?!IN\b|:\b|NN\b)

prüfen regex here

+0

Dies basiert auf meiner besten Schätzung, aber ich bin glücklich, meine Antwort basierend auf der Verfeinerung Ihrer Frage zu bearbeiten. – kaza

+0

Ich glaube, ich habe Ihre Frage verstanden und meine Antwort bearbeitet, um das Gleiche zu reflektieren. – kaza

+1

Der Schrägstrich ist kein Sonderzeichen, daher müssen Sie ihm nicht entkommen. – ekhumoro

1

Ich habe auf die Antwort von @bulbus sah und die regex, die in zeigte @ytomo Kommentare, die lautet:

[^\s/]*/IN\b[^/]*(?:/(?!IN\b|:\b)[^/]*\b)*/(?:NNP|CDP)\b 

Mein Problem ist, diese eine - und die anderen Vorschläge - keine Logik, um einen regulären Ausdruck für das Problem bei der Hand zu erstellen folgen. Lassen Sie mich Ihnen zeigen:

Der erste Teil, vor der Wiederholungsgruppe [^\s/]*/IN\b[^/]*, die ich vereinfachen werde \w+/IN\b [^ /] * 'entspricht mehr als Sie sollten. Schauen Sie sich example 1 an.

Was Sie lösen hier, in Worten ist:

  • eine \ lesen w +/IN Gruppe
  • durch eine beliebige Anzahl von \ s gefolgt [^ /] +/\ w + Gruppen, das ist nicht
  • solange Sie lesen können ..... bis
  • .... Sie haben die letzte NNP oder CDP-Gruppe gefunden, die Sie finden können.

Übersetzen Sie das direkt in eine Regex und Sie werden mit einer lesbareren Version kommen.(JMHO)

  1. \w+/IN\b(\s[^/]+/[^\s]+) lesen erste Gruppe nach dem In-Gruppe (example 2)
  2. \w+/IN\b(\s[^/]+/[^\s]+)* wiederholen, die zweite Gruppe (example 3)
  3. \w+/IN\b(\s[^:/]+/(?!IN|:)[^\s]+)* ignorieren: /: und \ w +/IN-Gruppen (example 4)
  4. \w+/IN\b(\s[^:/]+/(?!IN|:)[^\s]+)*\s\w+/(NNP|CDP)\b Stellen Sie sicher, Ihre letzte Gruppe ist NNP oder CDP (example 5)

Wenn w Vergleiche man dieses mit dem vorgeschlagenen Ergebnis von @ytomo in den Kommentaren der vorhergehenden Antwort, scheint es nicht so viel Unterschied zu geben. Der Grund, warum ich überhaupt geantwortet habe, ist, dass eine Regex lesbar und einer Logik entsprechend gelesen werden sollte. Ihr Code wird morgen in Produktion sein und - wenn Ihr Code kaputt geht - muss jemand ihn unter Zeitdruck überprüfen.

+0

'\ w +/IN \ b (\ s \ w +/(?! IN |:) \ w + \ b) * \ s \ w +/(NNP | CDP) \ b' Befolgen Sie Ihre Richtlinien nur ein paar Änderungen ... https://regex101.com/r/YYwLEn/8 – kaza

+0

Schätzen Sie sich die Zeit, um darauf hinzuweisen, danke! – kaza

+0

Hat die Freiheit genommen, die führende Bedingung zu entfernen, da OP nicht nach außen zeigte. – kaza

Verwandte Themen