2010-05-07 6 views
5

Diciamo che ho tre modelli/tabelle: operating_systems, words e programming_languages:Come realizzare un piccolo motore come 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... 

Quando un utente cerca hello, il sistema mostra il defenitions di 'ciao'. Questo è relativamente facile da implementare. Tuttavia, quando un utente cerca UNIX, il motore deve scegliere: word o operating_system. Inoltre, quando un utente cerca windows (lettera minuscola "w"), il motore sceglie word, ma dovrebbe anche mostrare Assuming 'windows' is a word. Use as an <a href="etc..">operating system</a> instead.

Qualcuno può indicarmi la direzione giusta con l'analisi e scegliendo l'argomento della query di ricerca? Grazie.


Nota: non ha bisogno di essere in grado di eseguire calcoli come WA può fare.

risposta

2

hanno una nuova tabella indice chiamato terms che contiene una versione con token di ciascun termine valido. In questo modo, devi solo cercare un tavolo.

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

Quindi è possibile vedere quanto vicino un termine di ricerca degli utenti è. Cioè "Windows" corrisponderebbe al 100% con 2, quindi supponiamo che, ma anche una corrispondenza ravvicinata con 1, suggerisca in alternativa. Devi scrivere il tuo motore di regole che ha deciso quanto corrisponde una parola vicina (cioè cosa viene assunto con "windows" o "Windows"?) Il campo Priority potrebbe essere il decisore finale se il motore delle regole non può decidere, e potrebbe in teoria essere guidato dall'attività dell'utente, in modo che impari a quali utenti è più probabile riferirsi.

+0

Grazie, darò un'occhiata a questo. –

+0

Sono riuscito a farlo funzionare! Io uso i partial per la visualizzazione dei dati. Uno parziale per argomento. –

1

E che dire di creare una cache sotto forma di una tabella di database in cui sarebbero presenti tutte le parole chiave.

La query di ricerca sarebbe qualcosa di simile a questo:

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

le parole chiave tabella conterrebbe una sorta di riferimenti ai vostri moduli.

Il vantaggio di questo approccio è ovviamente la ricerca rapida.

È possibile utilizzare due query al fine di simulare il comportamento di chiedere:

  • Corrispondenza esatta (nessun problema in MySQL)
  • Caso ricerca maiuscole
0

Wolfram Alpha è molto più complesso del tuo esempio ... Non sono sicuro del suo funzionamento interno (ho letto molto poco su di esso), ma credo che sia un grande e complesso automated inference system. Sono piuttosto banali da implementare (Prolog è fondamentalmente uno scopo generale in cui è possibile inserire tutti i dati necessari), ma sono molto difficili da rendere utili.

Problemi correlati