2

これは、私の質問に対する解決策を見つけようとして運が悪かった後の最初の投稿です。

あなたが私を助けることができれば、私は感謝します:)

ユーザーがテキストボックスで朝食に食べたものを入力した場合の解決策を開発しようとしているので、「トーストパンと牛乳を入れたオレンジ」と言うと、アプリは食べ物を認識するか、それらを識別してそれぞれのカロリー数を確認します次の表から 1 つ:

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" という新しい行を追加して、全文の最初のソリューションにし、残りの "同じランク" のソリューションを削除しました (私はユーザーからこれ以上の情報はないので、さまざまな種類の牛乳の平均カロリーを計算しています)

しかし、それでも、これはあまり正確ではありません。たとえば、オレンジなどでは、「オレンジ - ジュース」だけがより適切に一致するようにしたいときに、「オレンジ ケーキ - オーブン」という間違った最初のオプションがフルテキストで表示されます (少なくとも一致します)。完全に 1 つの列)。それでも、結果は同じ入力に対して複数のオプションを提供しており、スコア弁別を行うだけでは、アプリが一度入力された場合、同じ入力で2つの結果が得られないことを「理解」するのに十分ではありません.

念のため、私が自分自身を間違って説明した場合、私が望む最終的な結果は次のとおりです。

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

コードは必要ありませんが (時間がある場合は大歓迎です)、この目的のために使用する必要がある機能、またはこれらすべてを行うための他のより良い方法を理解するためにグーグルで調べます。

コードの 2 番目の部分は、食品にタイプミス (oarge など) がある場合でも食品を識別することです。これは、レーベンシュタイン距離で行われたと思いますが、必要性全体に同じソリューションを適用できるかどうかはわかりません..

前もって感謝します!!

4

1 に答える 1

0

問題を解決するためのいくつかのオプションがあると思います:

自然言語パーサーの作成 ( Wikipedia の NLP )

いくつかの解析ツール (google nlp phpのみ) を使用してフレーズをツリーにマッピングし、品詞のタグ付けを行って、必要な単語を抽出することができます (おそらく形容詞を使用して、食品が調理されています)。この方法は非常に複雑になる可能性があります。


ユーザー入力を制限する

アプリがどのように設計されているかを知っているのはあなただけですが、ユーザーがアプリを操作する方法を変更する可能性を検討してください。ユーザーに「追加」ボタンをクリックさせ、食品のリストから選択させることができます。


真ん中のどこか

タイピングの方が自然で速いと思うなら、上記の 2 つの間の妥協点を見つけることができるかもしれません。ユーザーに「栄養」の間にコンマを入れるように依頼したり、ある種のオートコンプリートを実装したりするように。この場合、いくつかの正規表現だけで機能します。


確かに、統計nlpを実行したり、辞書を使用して有用な単語のみを保持したりするなど、従うべき他のパスがあります...

入力エラーに関するもの: はい、レーベンシュタイン距離は広く使用されている手法であり、それを使用できます (何らかの方法でフレーズを分割して、データベースの Food 列に相当する文字列を作成する場合)。

于 2013-01-31T02:44:03.903 に答える