Как сделать небольшой движок вроде Wolfram | Alpha? - PullRequest
5 голосов
/ 07 мая 2010

Допустим, у меня есть три модели / таблицы: operating_systems, words и programming_languages:

# 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...

Когда пользователь ищет hello, система показывает определения «привет». Это относительно легко осуществить. Однако, когда пользователь ищет UNIX, движок должен выбрать: word или operating_system. Кроме того, когда пользователь ищет windows (строчная буква 'w'), механизм выбирает word, но также должен показывать Assuming 'windows' is a word. Use as an <a href="etc..">operating system</a> instead.

Может ли кто-нибудь указать мне правильное направление при разборе и выборе темы поискового запроса? Спасибо.


Примечание: нет необходимости выполнять вычисления, как это может сделать WA.

Ответы [ 3 ]

2 голосов
/ 07 мая 2010

Иметь новую индексную таблицу с именем terms, которая содержит маркерную версию каждого действительного термина. Таким образом, вам нужно искать только одну таблицу.

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

Затем вы можете увидеть, насколько близко совпадает поисковый запрос пользователя. То есть «Windows» будет на 100% соответствовать 2 - поэтому предположим, что, но также близко к 1, поэтому предложите это в качестве альтернативы. Вы должны написать свой собственный механизм правил, который решил, насколько близко соответствует слово (то есть, что предполагается при использовании «windows» против «Windows»?) Поле Priority может быть окончательным решением, если механизм правил не может решить и теоретически может зависеть от активности пользователя, поэтому он узнает, на что чаще всего ссылаются пользователи.

1 голос
/ 07 мая 2010

А что делать с кешем в виде таблицы базы данных, в которой были бы все ключевые слова?

Поисковый запрос будет выглядеть примерно так:

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

таблица ключевых слов будет содержать ссылки на ваши модули.

Преимуществом этого подхода является, конечно, быстрый поиск.

Вы можете использовать два запроса для имитации поведения, которое вы запрашиваете:

  • Точное совпадение (без проблем в mysql)
  • Поиск без учета регистра
0 голосов
/ 07 мая 2010

Wolfram Alpha намного сложнее, чем ваш пример ... Я не уверен в его внутренней работе (я очень мало читал об этом), но я считаю, что это очень большой и сложный автоматический вывод система . Они довольно просты в реализации (в основном, Prolog - это универсальная программа, в которую вы можете поместить любые необходимые данные), но их очень сложно сделать полезными.

...