2011-10-18 69 views
9

考慮,比方說,一個配方中自由文本形式(成分,步驟等的列表),我該如何解析以這樣的方式,我可以拉出來的成分(如數量,單位測量,成分名稱等)使用PHP?自然語言處理在PHP

假設自由文本格式化時有些

+1

定義 「* *有些格式化」。 –

+0

說「1杯牛奶」,「牛奶,1杯」,「少許鹽」,「2 250毫升牛奶罐」...... – StackOverflowNewbie

+1

http://stackoverflow.com/questions/4457830/nlp-programming -tools-使用的PHP – rid

回答

7

要做到這一點「正常」,你幾乎需要定義某種語法,然後可能使用LALR解析器或一些工具,如YACC,野牛或萊克斯建立一個解析器。假設你不想這樣做,它的strpos()ftw!

0

沒有一噸的語言建模的,我認爲唯一的辦法是有一個巨大的配料表和配方尋找他們。數量應該是成分之前的詞。

1

有對Java非常相似question。簡而言之,您需要詞典(例如成分)和術語(註釋)中的正則表達式語言。你可以做到這一點在Java中,並通過Web服務從PHP調用它,或者你可以嘗試在PHP重新實現它(注意,在第二種情況下,你可能有顯著放緩)。

0

如果你想迅速做到這一點,並收集資源收集的最小量,你也許可以想出一些好的啓發和一些正則表達式。

既然你說這個列表是「有點格式化,」我會假設工作有每行一個成分指令。

我首先想出一個測量名稱列表,這是一個相對封閉的類(我們稱之爲語言學),如$measurements=['cup', 'tablespoon', 'teaspoon', 'pinch', 'dash', 'to taste', ...]。你甚至可以拿出幾個項目映射到一個標準化的值的字典(所以$measurements={cup:['cup', 'c'], tablespoon:['tablespoon', 'tbsp', 'tablesp', ...], ...}或諸如此類的東西。)

然後在每一行,你可以找到測量單位如果是在你的字典。接下來,查找數字(可以格式化爲小數 - 例如1.5 - 或複雜的分數 - 例如2 1/2或2-1/2),並假設這是您需要的單位的數量。如果沒有號碼,那麼你可以假設單位是一個(如可能與「味」之類的情況下)。

最後,你可以假設任何事情所剩下的是實際的成分。

我想這啓發將覆蓋你的情況下75-80%。你仍然會有很多角落案例,比如當配方需要「2個桔子」時,或者更糟糕! - 「2個桔子汁」。在這些情況下,您可能希望將它們(在某種離線管理期間)添加爲例外情況,或讓他們「沒問題」,讓他們處理不當。