Как сделать небольшой движок вроде Wolfram|Alpha?

Допустим, у меня есть три модели/таблицы: 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.


person Community    schedule 07.05.2010    source источник


Ответы (3)


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

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

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

person Mat Ryer    schedule 07.05.2010
comment
Спасибо, я посмотрю на это. - person ; 07.05.2010
comment
Мне удалось заставить это работать! Я использую частичные для отображения данных. Одно частичное на тему. - person ; 07.05.2010

А как насчет того, чтобы сделать кеш в виде таблицы базы данных, где будут все ключевые слова.

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

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

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

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

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

  • Точное совпадение (без проблем в mysql)
  • Поиск без учета регистра
person Martin Vseticka    schedule 07.05.2010

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

person rmeador    schedule 07.05.2010