2012-04-13 8 views
2

Ich schreibe eine Python-Web-Anwendung, für die ich Suchabfragen mit benannten Entitäten verarbeiten muss. Zum Beispiel Wenn Suchabfrage ist: „Mac OS Löwen“ Und lässt sagen, dass ich diese Abfrage mit den Kandidaten auf meiner Datenbank zur Verfügung zu verarbeiten haben:Python natürliche Sprachverarbeitung für benannte Entitäten

  • Google Android.
  • Microsoft Windows.
  • Apple Mac OS X Lion
  • ...

Wir alle wissen, dass die 3. Folge das richtige Ergebnis. Aber können wir die Suchanfrage des Benutzers, d. H. "Mac OS Lion", auf "Apple Mac OS X Lion" abbilden (was der verfügbare Eintrag in meiner Datenbank ist). Kann mir jemand bitte sagen, wonach ich suchen soll oder was zu tun ist.

Antwort

2

Sie benötigen eine Art Normalisierung von Benutzeranfragen und müssen eine Zuordnung von diesen zu den richtigen "Klassen" "lernen".

Ein einfacher Weg wäre die Berechnung der Überlappung von "Tokens", die mit einer Ihrer "Klassen" übereinstimmen. Der folgende Beispielcode kann helfen:

CLASSES = ['Google Android', 'Microsoft Windows', 'Apple Mac OS X Lion'] 

def classify_query(query_string): 
    """ 
    Computes the most "likely" class for the given query string. 

    First normalises the query to lower case, then computes the number of 
    overlapping tokens for each of the possible classes. 

    The class(es) with the highest overlap are returned as a list. 

    """ 
    query_tokens = query_string.lower().split() 
    class_tokens = [[x.lower() for x in c.split()] for c in CLASSES] 

    overlap = [0] * len(CLASSES) 
    for token in query_tokens: 
     for index in range(len(CLASSES)): 
      if token in class_tokens[index]: 
       overlap[index] += 1 

    sorted_overlap = [(count, index) for index, count in enumerate(overlap)] 
    sorted_overlap.sort() 
    sorted_overlap.reverse() 

    best_count = sorted_overlap[0][0] 

    best_classes = [] 
    for count, index in sorted_overlap: 
     if count == best_count: 
      best_classes.append(CLASSES[index]) 
     else: 
      break 

    return best_classes 

Beispiel Ausgabe

classify_query('mac OS x') -> ['Apple Mac OS X Lion'] 
classify_query('Google') -> ['Google Android'] 

Natürlich ist dies nur eine sehr einfache Lösung. Vielleicht möchten Sie einige Zauber hinzufügen Kontrolle seine robust bei Tippfehlern in Abfrage-Strings ...

Hoffnung, das hilft :)

+0

Nun, ich war auch für einige Lösung auf Wikipedia suchen. Und ich kann quer über den Mindestabstand bearbeiten. Die minimale Bearbeitungsdistanz wird auf einzelne Zeichen angewendet. Was ich tun sollte, war das gleiche Konzept mit Tokens anstelle von Zeichen. Danke für deine Antwort übrigens. –

+0

Sie könnten zum Beispiel die Levenshtein-Distanz auf Strings verwenden, um eine gewisse Anzahl von "Tippfehlern" in Ihren Tokens zu berücksichtigen. Freue mich zu helfen. Irgendein Grund, meine Antwort nicht anzunehmen? – cfedermann

+1

Nun eigentlich sind beide Antworten wirklich sehr hilfreich. Eigentlich, als ich Dikei antwortete, fand ich es relevanter für mein Projekt. Aber für das, was ich hier gefragt habe, ist deine Antwort passender. Ich denke, ich sollte deine Antwort akzeptieren. Ich denke, SO sollte eine Möglichkeit haben, mehrere Antworten zu akzeptieren. Danke für deine Zeit. Das war sehr nett von dir. –

1

Wenn Sie nur einen ähnlichen Text zur Abfrage benötigen, können Sie eine Textsuchmaschine mit Python-Bindung wie Lucene + PyLucene verwenden.

Verwandte Themen