2011-10-18 14 views
9

フリーテキスト形式のレシピ(成分、ステップなどのリスト)が与えられているとすれば、どのようにしてそれを解析して成分を引き出すことができますか?測定値、成分名など)は、PHPを使用していますか?PHPでの自然言語処理

フリーテキストがとなり、ややとなっているものとします。

+1

"* somewhat * formatted"を定義します。 –

+0

"1カップミルク"、 "ミルク、1カップ"、 "塩のピンチ"、 "2 250ml牛乳"と言う... – StackOverflowNewbie

+1

可能な複製http://stackoverflow.com/questions/4457830/nlp-programming -tools-using-php – rid

答えて

7

これを正しく実行するには、ある種の文法を定義してから、LALRパーサーやyacc、bison、Lexなどのツールを使用してパーサーを構築する必要があります。あなたがそれをしたくないと仮定すると、strpos()ftw!

0

言語モデリングの大部分がなくても、唯一の方法は、成分の膨大なリストを用意してレシピで検索することだと思います。量は、成分の直前の単語でなければなりません。

1

Javaの場合は非常に似ていますquestionです。要するに、用語(言い換えれば、成分)の辞書や正規表現のような言葉(注釈)が必要です。 Javaで実行し、Webサービス経由でPHPから呼び出すこともできます。また、PHPで再実装することもできます(2番目のケースでは大幅に減速する可能性があります)。

3

あなたがこの参照探しているものをあなたを取得することができます名前実体抽出のためのJavaでopenNlpあり:http://opennlp.sourceforge.net/models-1.5/

次にあなたがPHPに結果を得るためのphp-javaのコネクタを使用することができますが。

0

これをすばやく行い、リソース収集量を最小限に抑えたい場合は、優れたヒューリスティックといくつかの正規表現を考え出すことができます。

リストが「いくらかフォーマットされている」と言っているので、1行に1つの成分指令があると仮定して作業します。

私は、比較的閉じたクラス(言語学では呼んでいる)である$measurements=['cup', 'tablespoon', 'teaspoon', 'pinch', 'dash', 'to taste', ...]のような測定名のリストを用意することから始めます。

次に、各行に、辞書に含まれている測定単位を見つけることができます。次に、数値(小数としてフォーマットされている可能性があります - たとえば1.5または複雑な小数 - たとえば2 1/2または2-1/2)を探し、それが必要な単位の数であると仮定します。数字がない場合は、そのユニットが1つであると仮定することができます(「味わう」などの場合もあります)。

最後に、残っているものは実際の成分であると仮定できます。

このヒューリスティックは、あなたのケースの75-80%をカバーすると思います。レシピで「2オレンジ」が必要な場合や、さらに悪い場合など、多くのコーナーケースが残っています。 - "2オレンジのジュース"。このような場合には、(オフラインキュレーションのある種の間に)例外として追加するか、適切に扱われていない状態で「OK」にするかのどちらかです。

関連する問題