2

这是我试图在没有运气的情况下找到我的问题的解决方案后的第一篇文章。

如果您能帮助我,我将不胜感激:)

我正在尝试开发一个解决方案,如果用户在 texbox 中输入他们早餐吃的东西,那么让我们说“带有烤面包和牛奶的橙子”,我的应用程序可以识别食物或识别它们以查看每种食物有多少卡路里下表之一:

Food         - cooked - Calories
Orange cake  - oven   -  200
Cow Milk     - raw    -  50
Sheep Milk   - raw    -  40
Orange       - juice  -  15
cereal bread - toast  -  10
bread        - toast  -  5
bacon        - toast  -  10

我所做的解决方案是对整个字符串进行全文搜索,而无需执行任何爆炸/内爆函数。所以我得到的结果是(通过记忆,所以它不准确):

Fulltext rank  -  Food        - cooked  -  Cal
10,523634      -  bacon       - toast   -  10
5,2342342      -  sheep milk  - raw     -  40
5,2342342      -  cow milk    - raw     -  50
4,2342345      -  cereal bread- toast   -  10
3,2342344      -  orange cake - oven    - 200
2,2342342      -  orange      - juice   -  15


$query="
SELECT Food, cooked, 
MATCH ( Food, cooked)
AGAINST (  '$search' ) AS score 
FROM food_table 
WHERE
MATCH ( Food, cooked) 
AGAINST (  '$search' ) 
ORDER  BY Score 
DESC LIMIT 50";

我发现有些分数相同,羊奶和牛奶,所以我在 mysql 中添加了一个名为“milk-average”的新行作为全文中的第一个解决方案,然后我删除了其余的“相同等级”解决方案(我不'没有来自用户的更多信息,所以我只是从不同种类的牛奶中平均卡路里)

但是,这仍然不是很准确,例如,对于橙子或其他人,全文给我一个错误的第一个选项,“橙子蛋糕 - 烤箱”,当我想要匹配更好的“橙子 - 果汁”时(至少它匹配一栏完美)。但是,结果仍然为我提供了相同输入的多个选项,并且进行分数区分还不足以让应用程序“理解”,如果输入一次,它不应该有两个具有相同输入的结果。

以防万一我解释错了,我想要的最终结果是:

input: 
an orange with toast bread and milk

Solution:
orange - juice - 15
bread  - toast - 5
milk   - average - 45 (this one, as said, is adding a new mysql row with the data)

Total: 65 calories

我不想要代码(如果你有时间,非常欢迎),但我需要为此目的使用的功能,或者任何其他更好的方法来完成所有这些,我会用谷歌搜索来理解。

代码的第二部分是识别食物,即使它们有任何拼写错误,例如 oarnge。我认为这是通过 Levenshtein 距离完成的,不确定我是否可以针对整个需求应用相同的解决方案..

提前致谢!!

4

1 回答 1

0

我认为您有一些选择可以解决您的问题:

编写自然语言解析器维基百科上的 NLP

您可以使用一些解析工具(只是 google nlp php)将短语映射到树中,进行一些词性标记,然后提取您需要的单词(可能带有它们的形容词,这样您就可以找到食物是否以及如何煮熟了)。这种方式可能相当复杂。


限制用户输入

只有您知道您的应用程序是如何设计的,但请考虑改变用户与其交互方式的可能性。您可以强制用户单击“添加”按钮并从食物列表中进行选择。


中间某处

如果您认为打字更自然,更快速,也许您可​​以在上述两者之间找到折衷方案。就像要求用户在“aliments”之间放置逗号和/或实现某种自动完成一样。在这种情况下,只有一些正则表达式可以完成这项工作。


当然还有其他途径可以遵循,比如做统计 nlp 或使用字典来只保留有用的词......

关于打字错误:是的,Levenshtein distance 是一种广泛使用的技术,您可以使用它(如果您以某种方式拆分短语,这样您就有了一个与数据库的 Food 列相当的字符串)。

于 2013-01-31T02:44:03.903 回答