2010-05-07 10 views
5

Lets sagen, ich habe drei Modelle/Tabellen: operating_systems, words und programming_languages:Wie macht man einen kleinen Motor wie Wolfram | Alpha?

# operating_systems 
name:string created_by:string family:string 
Windows  Microsoft   MS-DOS 
Mac OS X Apple    UNIX 
Linux  Linus Torvalds UNIX 
UNIX  AT&T    UNIX 

# words 
word:string defenitions:string 
window  (serialized hash of defenitions) 
hello  (serialized hash of defenitions) 
UNIX  (serialized hash of defenitions) 

# programming_languages 
name:string created_by:string example_code:text 
C++   Bjarne Stroustrup #include <iostream> etc... 
HelloWorld Jeff Skeet  h 
AnotherOne Jon Atwood  imports 'SORULEZ.cs' etc... 

Wenn ein Benutzer hello sucht, das System zeigt die defenitions von 'Hallo'. Dies ist relativ einfach zu implementieren. Wenn ein Benutzer jedoch UNIX sucht, muss der Motor wählen: word oder . Wenn ein Benutzer windows (Kleinbuchstabe 'w') sucht, wählt die Suchmaschine word, sollte aber auch Assuming 'windows' is a word. Use as an <a href="etc..">operating system</a> instead anzeigen.

Kann mir jemand mit dem Parsen und Auswählen des Themas der Suchanfrage in die richtige Richtung zeigen? Vielen Dank.


Hinweis: braucht er nicht in der Lage sein, Berechnungen durchzuführen, wie WA tun können.

Antwort

2

eine neue Indextabelle haben genannt terms, die eine in Token-Version von jedem gültigen Begriff enthält. Auf diese Weise müssen Sie nur eine Tabelle durchsuchen.

# terms 
Id Name  Type    Priority 
1 window word    false 
2 Windows operating_system true 

Dann können Sie sehen, wie nahe ein Treffer der Benutzer Suchbegriff ist. I.e. "Windows" wäre eine 100% ige Übereinstimmung mit 2 - also davon ausgehen, dass aber eine enge Übereinstimmung mit 1 auch, so dass als Alternative vorschlagen. Sie müssen Ihre eigene Regel-Engine schreiben, die entscheidet, wie nahe ein Wort passt (dh was wird mit "Windows" vs "Windows" angenommen?) Das Priority Feld könnte der letzte Entscheider sein, wenn die Regel-Engine nicht entscheiden kann, und könnte theoretisch durch die Benutzeraktivität gesteuert werden, so dass es lernt, auf welche Benutzer sich eher beziehen.

+0

Danke, ich werde es mir ansehen. –

+0

Ich habe es geschafft zu arbeiten! Ich verwende Partials für die Anzeige von Daten. Ein Teil pro Thema. –

1

Und was ist mit einem Cache in Form einer Datenbanktabelle, wo alle Schlüsselwörter sein würden.

Die Suchabfrage würde wie folgt sein:

SELECT * FROM keywords WHERE keyword = '<YourKeyWord>' /* mysql */ 

die Schlüsselwörter Tisch eine Art von Verweisen auf Ihre Module enthalten würde.

Der Vorteil dieses Ansatzes ist natürlich die schnelle Suche.

Sie können zwei Abfragen verwenden, um das Verhalten Sie bitten, zu simulieren:

  • Exact Match (kein Problem in mysql)
  • Groß- und Kleinschreibung Suche
0

Wolfram Alpha ist viel komplexer als Ihr Beispiel ... Ich bin mir seiner inneren Funktionsweise nicht sicher (ich habe sehr wenig darüber gelesen), aber ich glaube, es ist ein sehr großes und komplexes automated inference system. Sie sind eher trivial zu implementieren (Prolog ist im Grunde ein allgemeiner Zweck, den Sie setzen können, welche Daten Sie benötigen), aber sie sind sehr schwer, nützlich zu machen.

Verwandte Themen