如何制作像Wolfram | Alpha这样的小型引擎?

时间:2010-05-07 16:11:14

标签: ruby-on-rails parsing prediction wolframalpha

假设我有三个模型/表:operating_systemswordsprogramming_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时,引擎必须选择:wordoperating_system。此外,当用户搜索windows(小写字母'w')时,引擎会选择word,但也应显示Assuming 'windows' is a word. Use as an <a href="etc..">operating system</a> instead

有人可以通过解析和选择搜索查询的主题来指出我正确的方向吗?感谢。


注意:它不需要像WA那样执行计算。

3 个答案:

答案 0 :(得分:2)

有一个名为terms的新索引表,其中包含每个有效术语的标记化版本。这样,您只需要搜索一个表。

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

然后,您可以看到用户搜索字词的匹配程度。即“Windows”与2 100%匹配 - 所以假设,但与1的匹配也是如此,因此建议作为替代方案。你必须编写自己的规则引擎,决定一个单词的匹配程度(即“windows”与“Windows”的假设是什么?)Priority字段可以是最终决策者,如果规则引擎可以'决定,理论上可以由用户活动驱动,以便了解用户更有可能参考的内容。

答案 1 :(得分:1)

如何以数据库表的形式创建一个缓存,其中包含所有关键字。

搜索查询将是这样的:

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

keywords 表将包含对模块的某种引用。

此审批的优势当然是快速搜索。

您可以使用两个查询来模拟您要求的行为:

  • 完全匹配(mysql没问题)
  • 不区分大小写的搜索

答案 2 :(得分:0)

Wolfram Alpha比你的例子复杂得多......我不确定它的内部运作方式(我对它的阅读很少),但我认为它是一个非常庞大而复杂的automated inference system 。它们实现起来相当简单(Prolog基本上是一个通用的,你可以把你需要的任何数据放进去),但它们很难有用。