2017-05-23 6 views
1

Ich versuche, einen Text zu drucken, während bestimmte Wörter und Wort Bigramme hervorheben. Dies wäre ziemlich geradlinig, wenn ich die anderen Token wie Interpunktion und dergleichen nicht drucken müsste.Markieren Sie bestimmte Wörter in der Reihenfolge

Ich habe eine Liste von Wörtern zu markieren und eine andere Liste von Wort Bigrammen zu markieren.

einzelne Wörter Hervorhebungen ist ziemlich einfach, wie zum Beispiel:

import re 
import string 

regex_pattern = re.compile("([%s \n])" % string.punctuation) 

def highlighter(content, terms_to_hightlight): 
    tokens = regex_pattern.split(content) 
    for token in tokens: 
     if token.lower() in terms_to_hightlight: 
      print('\x1b[6;30;42m' + token + '\x1b[0m', end="") 
     else: 
      print(token, end="") 

Nur markieren Wörter, die in der Reihenfolge erscheinen komplexer ist. Ich habe mit Iteratoren herumgespielt, aber ich konnte mir nichts einfallen lassen, was nicht offensichtlich kompliziert ist.

+0

Können Sie ein Beispiel für Fälle angeben, in denen Ihre 'Highlighter'-Funktion wie erwartet und * nicht * wie erwartet funktioniert? Tipp: Wie sehen "Wörter, die in Reihenfolge erscheinen" für dich aus? – blacksite

+1

Sie könnten den Text zuerst in eine Liste aufteilen und dann diese Liste durchlaufen (ähnlich wie Sie es bereits getan haben). Dann gehen Sie durch diese Liste und überprüfen, ob das aktuelle und das nächste Element ein gültiges Bigramm ist. Wenn dies der Fall ist, drücken Sie die Wörter "hervorgehoben" in eine separate Liste. Andernfalls drücken Sie es "unmarkiert" in die Liste. Stellen Sie sicher, dass Sie immer überprüfen, ob das vorherige Bigramm bereits das aktuelle Element (der neuen Liste) markiert hat. –

+0

@not_a_robot Er sucht wahrscheinlich nach Wortbigrammen, was zwei Wörter hintereinander bedeutet. Er versucht, einige Wörter hervorzuheben, wenn sie in einer Liste von Bigrammen sind. Dies führt zu überlappenden Problemen. –

Antwort

0

Wenn ich die Frage richtig verstanden habe, ist eine Lösung, nach dem nächsten Wort-Token zu schauen und zu prüfen, ob das Bigramm in der Liste ist.

import re 
import string 

regex_pattern = re.compile("([%s \n])" % string.punctuation) 

def find_next_word(tokens, idx): 
    nonword = string.punctuation + " \n" 
    for i in range(idx+1, len(tokens)): 
     if tokens[i] not in nonword: 
      return (tokens[i], i) 
    return (None, -1) 

def highlighter(content, terms, bigrams): 
    tokens = regex_pattern.split(content) 
    idx = 0 
    while idx < len(tokens): 
     token = tokens[idx] 
     (next_word, nw_idx) = find_next_word(tokens, idx) 
     if token.lower() in terms: 
      print('*' + token + '*', end="") 
      idx += 1 
     elif next_word and (token.lower(), next_word.lower()) in bigrams: 
      concat = "".join(tokens[idx:nw_idx+1]) 
      print('-' + concat + '-', end="") 
      idx = nw_idx + 1 
     else: 
      print(token, end="") 
      idx += 1 

terms = ['man', 'the'] 
bigrams = [('once', 'upon'), ('i','was')] 
text = 'Once upon a time, as I was walking to the city, I met a man. As I was tired, I did not look once... upon this man.' 
highlighter(text, terms, bigrams) 

Wenn sie aufgerufen wird, ergibt dies:

-Once upon- a time, as -I was- walking to *the* city, I met a *man*. As -I was- tired, I did not look -once... upon- this *man*. 

Bitte beachten Sie, dass:

  • dies ist ein Greedy-Algorithmus, wird es die erste Bigramm passen es findet. So prüfen Sie zum Beispiel nach yellow banana und banana boat, yellow banana boat wird immer als -yellow banana- boat markiert. Wenn Sie ein anderes Verhalten wünschen, sollten Sie die Testlogik aktualisieren.
  • Sie wahrscheinlich wollen auch die Logik aktualisieren, den Fall zu verwalten, wo ein Wort sowohl in terms ist und der erste Teil eines Bigramm
  • ich nicht alle Grenzfälle getestet haben, können einige Dinge brechen/kann es sein Zaun -Post Fehler
  • Sie die Leistung bei Bedarf durch optimieren können:
    • Aufbau eine Liste der ersten Worte des Bigramm und prüfen, ob ein Wort in es ist
    • , bevor Sie den Vorgriff zum nächsten Wort und/oder Verwenden des Ergebnisses des Vorausschauens, um alle Nicht-Wort-Token zwischen zwei in einem Schritt zu behandeln Wörter

this helps (diesen Schritt der Umsetzung sollte lineare Leistungs genug sein, um zu gewährleisten).

Verwandte Themen