这是一个关于美食做法的搜素引擎,它的特色在于语义搜索。这是研一上学期时学院里分配的一个工程实践任务(4人组),因为平时课业作业比较多,到现在写了好几个月了。现在完成了一小阶段,打算把整个项目上传到仓库里。
在实现这个搜索引擎过程中,使用了Python处理所有与数据有关的模块,PHP完成自然语言分析以及服务器的搭建,写的比较简陋,在不断的完善中。。。
在data文件中,存放了所有从美食天下网爬到的数据,以为对应的数据处理程序。数据的收集和处理,实现上都不是太难,但耗费了很多时间。最共抓取了大约3.5W条菜的记录,在此给贵网站带来的不便,致以深深的歉意。
这里包含了自然语言处理、数据库交互两部分。使用PHP实现了整个服务器框架,因为我没学过PHP,所以很多代码看起来很low。
因为这个工程重点在于语义分析,放在了lib文件夹中。关于语义分析,我了解的知识很少,现在在补充这方面的知识。
我们的做法是先对用户的输入进行分词,这里使用的分词工具是scws,使用了它的PHP扩展。其中我的一位队友正在完善scws的词典部分。
然后根据分词的结果,对其进行同义词扩展,同义词词典syno.db位于**lib/nlp/db/**中,然后使用贝叶斯分类器,判断用户想搜索的类别。
语义分析是一个不断迭代不断升级的过程,这里我根据贝叶斯公式,写了一个关于菜名、食材、类型的分类器,效果不错,它位于lib/nlp/nlp.php中,计算的先验概率放在lib/nlp/db/gather.txt中。
用户输入: 西红柿炒鸡蛋
分词结果: 西红柿 炒 鸡蛋
分类结果: 菜名
我在想,在这里使用贝叶斯分类器其实是不合适的。。。因为我提取的特征之间并不是独立的。假如说,
用户输入:西红柿
西红柿既可能属于菜名,又可能属于食材。
这里我采用的解决办法是:计算每个类别的概率,若两者相差不大的情况下,同时返回两者。具体实现在lib/nlp/nlp.php中
一方面多看语义分析相关的论文,提升语义分析的准确度,一方面完善一下各个词典以及数据文件,如lib/nlp/nlp/db/gather.txt、syno.txt等文件