识别字符串中的单个/多个食物元素(用户输入)

时间:2013-01-24 14:35:13

标签: php mysql regex full-text-search

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

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

我正在尝试开发一个解决方案,例如用户输入他们在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距离来完成的,不确定我是否可以为整个需求应用相同的解决方案。

提前致谢!!

1 个答案:

答案 0 :(得分:0)

我认为你有一些方法可以解决你的问题:

编写自然语言解析器NLP on Wikipedia

您可以使用一些解析工具(只需谷歌 nlp php )将短语映射到树中,进行一些词性标记,然后提取您需要的单词(可能使用其形容词) ,你可以找到食物是否以及如何烹饪)。 这种方式可能非常复杂。


限制用户输入

只有您了解应用的设计方式,但请考虑更改用户与其互动方式的可能性。您可以强制用户点击“添加”按钮并从食物列表中选择。


位于中间位置

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


肯定还有其他路径可以遵循,例如统计nlp或使用字典来保留有用的词......

关于键入错误的问题:是的,Levenshtein距离是一种广泛使用的技术,您可以使用它(如果您以某种方式拆分短语,那么您的字符串可以与数据库的Food列相媲美)。