这是我试图在没有运气的情况下找到问题的解决方案后的第一篇文章。
如果您能帮助我:),我将不胜感激
我正在尝试开发一个解决方案,如果用户在 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 中添加了一个名为"牛奶 - 平均"的新行作为全文中的第一个解决方案,然后我删除了其余的"相同等级"解决方案(我没有来自用户的更多信息,所以我只是从不同种类的牛奶中获取卡路里的平均数)
但是,这仍然不是很准确,例如,对于橙色或其他,全文给了我一个错误的第一个选项,"橙子蛋糕 - 烤箱",当我只想有"橙子 - 果汁"时匹配得更好(至少它完美匹配一列)。但是,结果仍然为我提供了相同输入的多个选项,并且进行分数区分不足以让应用程序"理解"如果输入一次,它不应该有两个具有相同输入的结果。
以防万一如果我解释错误,我想要的最终结果是:
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
我不想要代码(如果你有时间,非常欢迎),但我需要为此目的使用的功能,或任何其他更好的方法来完成所有这些,我会谷歌它来理解。
代码的第二部分是识别食物,即使它们有任何错别字,例如桨。我认为这是用Levenshtein距离完成的,不确定我是否可以为整个需求应用相同的解决方案。
提前感谢!!
我认为您有一些选择来解决您的问题:
编写自然语言解析器(维基百科上的NLP)
您可以使用一些解析工具(只是谷歌nlp php)将短语映射到树中,进行一些词性标记,从而提取您需要的单词(也许带有它们的形容词,这样您就可以找到食物是否以及如何烹饪)。这种方式可能非常复杂。
限制用户输入
只有您知道应用的设计方式,但请考虑更改用户与其交互方式的可能性。您可以强制用户单击"添加"按钮并从食物列表中进行选择。
索姆在中间
如果您认为打字更自然,更快速,也许您可以在上述两者之间找到折衷方案。就像要求用户在"食物"之间加上逗号和/或实现某种自动完成一样。在这种情况下,只有一些正则表达式可以完成这项工作。
当然还有其他路径可以遵循,例如进行统计nlp或使用字典仅保留有用的单词...
对于有关打字错误的问题:是的,Levenshtein 距离是一种广泛使用的技术,您可以使用它(如果您以某种方式拆分短语,以便您有一个与数据库的 Food 列相当的字符串)。