2012-09-13 14 views
15

मैं एक रूबी रेसिपी प्रबंधन अनुप्रयोग का निर्माण कर रहा हूं, और इसके हिस्से के रूप में, मैं घटक मात्रा को एक रूप में पार्स करने में सक्षम होना चाहता हूं जिसे मैं तुलना और स्केल कर सकता हूं। मैं सोच रहा हूं कि ऐसा करने के लिए सबसे अच्छे उपकरण क्या हैं।व्यंजनों के लिए प्राकृतिक भाषा घटक मात्रा को पार्सिंग

मैं मूल रूप से तो कुछ अन्य कोड है कि पूर्णांकों में two या five की तरह मानव पठनीय संख्या, और अंत में कोड का कहना है कि 1 cup और 3 teaspoons कुछ आधार माप में बदल जाएगा धर्मान्तरित पर, एक जटिल regex पर योजना बनाई। मैं इनपुट को नियंत्रित करता हूं, इसलिए मैंने वास्तविक घटक को अलग रखा। हालांकि, मैंने उपयोगकर्ताओं को to taste और 1 package जैसे अमूर्त माप इनपुट करने वाले उपयोगकर्ताओं को देखा। कम से कम अमूर्त माप के साथ, मुझे लगता है कि मैं उन्हें केवल अनदेखा कर सकता हूं और स्केल कर सकता हूं और उन्हें पहले से किसी भी संख्या को स्क्रैप कर सकता हूं।

यहाँ कुछ और उदाहरण

1 tall can 
1/4 cup 
2 Leaves 
1 packet 
To Taste 
One 
Two slices 
3-4 fillets 
Half-bunch 
2 to 3 pinches (optional) 

रहे हैं वहाँ इस के लिए किसी भी चाल कर रहे हैं? मैंने देखा है कि उपयोगकर्ता कुछ हद तक उलझन में हैं जो मात्रा का गठन करते हैं। मैं कठोर नियमों को लागू करने और घटक भाग में tall can और leaves जैसी चीजों को धक्का देने का प्रयास कर सकता हूं। हालांकि, इसे लागू करने के लिए, मुझे यह बताने में सक्षम होना चाहिए कि क्या अमान्य है।

क्या कोई एपीआई या मणि मैं उपयोग कर सकता हूं? वुल्फ्राम एल्फा ने पहले वादा किया, लेकिन आखिरकार, मुझे नहीं लगता कि यह तब तक काम करेगा जब तक कि मैं उन्हें बता सकूं कि मैं केवल उन्हें नुस्खा मात्रा खिला रहा हूं।

मुझे यह भी सुनिश्चित नहीं है कि "आधार" माप मुझे मात्राओं को किस रूप में परिवर्तित करना चाहिए।

संपादित करें: किसी भी भ्रम को दूर करने के लिए, ये मेरे लक्ष्य हैं।

  1. व्यंजनों को स्केल करने में सक्षम होने के लिए। माप की मनमानी इकाइयां packages को स्केल नहीं किया जाना चाहिए, लेकिन cups या ounces जैसे सटीक वाले होने की आवश्यकता है।

  2. "मुख्य" अवयवों को चित्रित करें। इस प्रश्न के संदर्भ में, यह पता लगाने के द्वारा किया जाएगा कि नुस्खा में सबसे बड़ा घटक क्या है। उत्पादन में, घटक के प्रकार के आधार पर कुछ प्रकार के संशोधक होना चाहिए क्योंकि जाहिर है, flour लगभग "मुख्य" घटक कभी नहीं माना जाता है। हालांकि, chocolate का उपयोग कम से कम किया जा सकता है, और इसे अभी भी chocolate cake कहा जा सकता है।

  3. इनपुट सामान्यीकृत करें। साइट पर कुछ स्थिरता रखने के लिए, मैं निरंतर संक्षेप रखना चाहता हूं। उदाहरण के लिए, pounds के बजाय, यह lbs होना चाहिए।

क्योंकि मैं सोच रहा हूँ अगर यह NLTK साथ अजगर में करने के लिए आसान होगा मैं भी NLTK टैग लगाया।

+0

क्या आप इसे "आधा-गुच्छा" स्केल करने की कोशिश कर रहे हैं यदि मैं नुस्खा को तीन गुना करना चाहता हूं तो "1.5 बंच" बन जाता है? –

+0

आखिरकार हाँ संस्करण 1 के लिए जो कि एक पुल बहुत दूर हो सकता है। – hadees

+0

टैको मसाला का एक पैकेट 4oz है, क्रीमकीज़ का एक पैकेट 8oz है, इसलिए यह पता लगाने में मुश्किल है कि एक पैकेट कितना है। हालांकि, अगर आप संख्या को पार्स कर सकते हैं, तो आपको बस जो कुछ भी हो, उसे गुणा करने की आवश्यकता है। यह हमें बताने में मददगार हो सकता है कि आपका वांछित आउटपुट कुछ उदाहरणों के माध्यम से इनपुट पर आधारित है। –

उत्तर

20

आप दो समस्याएं पैदा, पहचानने/मात्रा भाव निकालने (सिंटेक्स) और पता लगाना क्या राशि का मतलब है (अर्थशास्त्र)।

इससे पहले कि आप पता लगाएँ कि क्या regexps के लिए पर्याप्त हैं आंकड़ा मात्रा को समझते हैं, आप अपने आप को एक अच्छा स्कीमा क्या वे की तरह लग की (व्याकरण) बनाना चाहिए।आपका उदाहरण इस तरह दिखेगा:

<amount> <unit> [of <ingredient>] 

जहां <amount> ले जा सकते हैं कई रूपों:

whole or decimal number, in digits (250, 0.75) 
common fraction (3/4) 
numeral in words (half, one, ten, twenty-five, three quarters) 
determiner instead of a numeral ("an onion") 
subjective (some, a few, several) 

राशि भी दो सरल <amount> रों की एक श्रृंखला के रूप में व्यक्त किया जा सकता है:

two to three 
2 to 3 
2-3 
five to 10 

फिर आपके पास इकाइयां हैं:

general-purpose measurements (lb, oz, kg, g; pounds, ounces, etc.) 
cooking units (Tb, tsp) 
informal units (a pinch, a dash) 
container sizes (package, bunch, large can) 
no unit at all, for countable ingredients (as in "three lemons") 

अंत में, भाव है कि या तो मात्रा या इकाइयों के साथ कभी नहीं जोड़ा जा सकता है की एक विशेष बात है, तो वे प्रभावी ढंग से दोनों के संयोजन के रूप में कार्य:

a little 
to taste 

मैं एक छोटे से पार्सर के रूप में यह आ रहा सुझाव देंगे , जिसे आप विस्तृत या उतना ही मोटा कर सकते हैं जितना आपको चाहिए। उन सभी के लिए रेगेक्सप्स लिखना बहुत कठिन नहीं होना चाहिए, यदि यह आपकी पसंद का टूल है, लेकिन जैसा कि आप देखते हैं कि यह केवल पाठ प्रतिस्थापन का सवाल नहीं है। भागों को खींचें और प्रत्येक घटक को ट्रिपल (amount, unit, ingredient) के रूप में प्रस्तुत करें। (काउंटरबेल के लिए, एक विशेष इकाई "टुकड़े" या जो भी हो; "थोड़ा" और जैसे, मैं उन्हें विशेष इकाइयों के रूप में मानता हूं) का उपयोग करें।

का प्रश्न मात्राओं को परिवर्तित या तुलना करने से बचाता है। यूनिट रूपांतरण कई स्थानों पर किया गया है, इसलिए कम से कम आधिकारिक इकाइयों के लिए आपको रूपांतरण तालिकाएं प्राप्त करने में कोई परेशानी नहीं होनी चाहिए। उदाहरण के लिए, यदि आप "4oz से ग्राम में कनवर्ट करें" टाइप करते हैं तो Google ऐसा करेगा। ध्यान दें कि देश के आधार पर एक Tbsp either three or four tsp है।

आप अच्छी तरह से परिभाषित इकाइयों के लिए अपनी पसंदीदा इकाइयों को आसानी से मानकीकृत कर सकते हैं, लेकिन अनौपचारिक इकाइयां थोड़ी सी चालक हैं। "एक चुटकी", "एक डैश" के लिए, और जैसे, मैं अनुमानित वजन का पता लगाने का सुझाव दूंगा ताकि आप ठीक से स्केल कर सकें (दस चुटकी = 2 ग्राम, या जो भी हो)। कैन और जैसे निराशाजनक हैं, जब तक कि आप विशेष उत्पादों के आकार को देख सकें।

दूसरी तरफ, व्यक्तिपरक मात्रा सबसे आसान है: यदि आप दस बार "स्वाद" के लिए स्केल करते हैं, तो यह अभी भी "स्वाद" है!

एक आखिरी सोचा: अच्छी तरह से "एक अंडा" शायद नहीं है प्रमुख घटक है, लेकिन "एक छोटी सी बकरी, quartered" हो सकता है: सामग्री के डेटाबेस के दौरान किसी प्रकार भी पहचानने मुख्य तत्व, आकार मामलों के बाद से के लिए आवश्यक है हो। मैं इसे संस्करण 2 के लिए मानता हूं।

0

जहां तक ​​इन के रूप में जाना:

  1. मैं मुश्किल कोड चाहते इन करें, जिससे कि अगर आप इतने सारे औंस की तुलना में अधिक मिलता है, कप के लिए जाना है, अगर आप mroe इतने सारे कप से मिलता है, के लिए जाना पिंट्स, लिटर, गैलन, आदिमुझे नहीं पता कि आप इससे कैसे बच सकते हैं जब तक कि किसी ने इसे संभालने के लिए कोड पहले से ही लिखा हो।

  2. यदि कोई घटक शीर्षक में है, तो यह शायद मुख्य घटक है। यद्यपि आप "ओटमील किशमिश कुकीज़" के साथ मुद्दों में भाग लेंगे। जैसा कि आपने कहा है, आटा, दूध, आदि मुख्य घटक नहीं हैं। आपको बेकन, सूअर का मांस काट, सूअर का मांस सूअर का मांस, और स्टेक, हैम्बर्गर, आदि को संभवतः गोमांस को मानचित्र करने की भी आवश्यकता होगी।

  3. फिर से, यह कुछ की मात्रा पर एक नज़र है, आप जानते हैं कि लोगों को एलबीएस, ओज इत्यादि होने जा रहे हैं, इसलिए उन्हें मुक्त करने और इसे जितना संभव हो उतना लिखने का प्रयास करें। आप कुछ याद कर सकते हैं, लेकिन जैसे ही आपकी साइट बढ़ती है, आप एक नया फ़िल्टर पेश करने में सक्षम होंगे।

आप इस सब काम के माध्यम से जाना है, तो इसे जारी करें ताकि अन्य लोग के लिए :)

9

रेगुलर एक्सप्रेशन प्राकृतिक भाषा पार्स लिए सही पाने के लिए मुश्किल हो जाता है की जरूरत नहीं है पर विचार करें। जैसा कि आपने उल्लेख किया है, एनएलटीके, शायद अन्यथा देखने के लिए एक अच्छा विकल्प होगा, आप स्वयं को अभिव्यक्तियों को सही तरीके से प्राप्त करने की कोशिश कर रहे मंडलियों में घूमते पाएंगे।

आप NLTK के बजाय रूबी विविधता के बारे में कुछ चाहते हैं, उपचार पर एक नज़र डालें:

http://deveiate.org/projects/Linguistics

:

https://github.com/louismullie/treat

इसके अलावा, भाषा विज्ञान ढांचे के रूप में अच्छी तरह से एक अच्छा विकल्प हो सकता है

संपादित करें:

मैं च igured वहाँ पहले से ही वहाँ बाहर एक रूबी नुस्खा पार्सर होना ही था, यहाँ एक और विकल्प आप में देखना चाहते हो सकता है है:

https://github.com/iancanderson/ingreedy

6

यदि आप जानते हैं कि एक अच्छा वेब स्क्रैपर और पार्सिंग टूल कैसे लिखना है, तो वहां बहुत सारे मुफ्त प्रशिक्षण डेटा उपलब्ध हैं।

http://allrecipes.com/Recipe/Darias-Slow-Cooker-Beef-Stroganoff - यह साइट आपको मेट्रिक/शाही प्रणाली और डिनरों की संख्या के आधार पर नुस्खा मात्रा को परिवर्तित करने देती है।

http://www.epicurious.com/tools/conversions/common - इस साइट में बहुत सारे रूपांतरण स्थिरांक हैं।

मौजूदा नुस्खा साइटों के कुछ व्यवस्थित स्क्रैपिंग जो कुछ संरचित प्रारूप (जो आप अंतर्निहित एचटीएमएल पढ़कर खोज सकते हैं) में प्रक्रियाएं प्रस्तुत करते हैं, आपको वास्तव में एक बड़ा प्रशिक्षण डेटा सेट बनाने में मदद मिलेगी जो ऐसी समस्या को उठाएगी बहुत आसान है।

जब आपके पास बहुत अधिक डेटा है, तो सरल सीखने की तकनीक भी बहुत उपयोगी हो सकती है। एक बार आपके पास बहुत अधिक डेटा हो जाने के बाद, आप शानदार एनएलपी चाल (ngrams, tf-idf, naive bayes, आदि) का उपयोग कर सकते हैं ताकि जल्दी से अद्भुत चीजें कर सकें।

उदाहरण के लिए:
मुख्य घटक-साय
एक उच्च आईडीएफ (उलटा दस्तावेज़ आवृत्ति) के साथ एक थाली में सामग्री अधिक मुख्य तत्व होने की संभावना है। प्रत्येक पकवान नमक का उल्लेख करता है, इसलिए यह बहुत कम आईडीएफ होना चाहिए। बहुत कम व्यंजन तेल का जिक्र करते हैं, इसलिए इसमें उच्च आईडीएफ होना चाहिए। अधिकांश व्यंजनों में शायद केवल एक मुख्य प्रोटीन होता है, इसलिए 'चिकन', 'टोफू' आदि जैसे वाक्यांश दुर्लभ होते हैं और नमक, प्याज, तेल इत्यादि की तुलना में मुख्य तत्व होने की संभावना अधिक होती है। बेशक वहां 'सिलेंटर' 'जो' चिकन 'से दुर्लभ हो सकता है, लेकिन यदि आपने प्रत्येक पकवान के साथ कुछ प्रासंगिक मेटाडाटा को तोड़ दिया था, तो आपके पास सिग्नल होंगे जो आपको इस समस्या को ठीक करने में भी मदद करेंगे। अधिकांश शेफ अपने व्यंजनों में सिलेंडर का उपयोग नहीं कर रहे हैं, लेकिन जो लोग शायद इसका उपयोग करते हैं। तो किसी भी घटक नाम के लिए, आप केवल उन लेखकों पर विचार करके नाम के आईडीएफ को समझ सकते हैं, जिन्होंने कम से कम एक बार घटक का उल्लेख किया है, और फिर व्यंजनों के इस सबसेट पर घटक का आईडीएफ देख रहा है।

स्केलिंग व्यंजनों
अधिकांश नुस्खा साइटों का उल्लेख है कि कितने लोगों को एक विशेष पकवान की सेवा है, और लोगों की संख्या के लिए उचित मात्रा के साथ एक अलग सामग्री की सूची है।
किसी भी विशेष घटक के लिए, आप उन सभी व्यंजनों को एकत्र कर सकते हैं जो इसका उल्लेख करते हैं और देखें कि कितने लोगों के लिए घटक की मात्रा निर्धारित की गई थी। यह आपको बताएगा कि उस घटक के लिए मात्राओं का वर्णन करने के लिए वाक्यांशों का उपयोग किया जाता है, और संख्याएं कैसे स्केल करती हैं। इसके अलावा अब आप उन सभी सामग्रियों को एकत्र कर सकते हैं जिनकी मात्रा किसी विशेष वाक्यांश (जैसे 'स्लाइस' -> (रोटी, पनीर, टोफू, ...), 'कप' -> (चावल, आटा, पागल, ..) का उपयोग करके वर्णित की गई है। ।)) और इन वाक्यांशों के सबसे आम को देखें और मैन्युअल रूप से लिखें कि वे कैसे स्केल करेंगे।

मानक के अनुसार इनपुट
यह एक कठिन समस्या की तरह बिल्कुल नहीं लगता है। आम संक्षेपों और उनके पूर्ण रूपों (जैसे 'एलबीएस' -> 'पाउंड', 'किग्रा' -> 'किलोग्राम', 'ओज' -> 'औंस' इत्यादि) की सूची को मैन्युअल रूप से क्यूरेट करना समस्या का 9 0% हल करना चाहिए। जब भी आप उन्हें देखते हैं तो इस सूची में नए संकुचन जोड़ना कुछ समय बाद इस सूची को काफी व्यापक बनाना चाहिए।

संक्षेप में, मैं आपको अपने डेटा के आकार को बड़े पैमाने पर बढ़ाने के लिए कह रहा हूं और आपके द्वारा स्क्रैप (लेखक की जानकारी, भोजन शैली, आदि) के साथ कई प्रासंगिक मेटाडेटा एकत्रित करने के लिए कह रहा हूं, और इस सभी संरचित डेटा को सरल के साथ उपयोग करें एक बुद्धिमान नुस्खा साइट बनाने की कोशिश करते समय आपको सामना करने वाली अधिकांश समस्याओं को हल करने के लिए एनएलपी/एमएल चालें।

+0

व्यापक, धन्यवाद! – katspaugh

+0

अतिरिक्त जानकारी के लिए धन्यवाद हालांकि अधिकांश व्यंजनों को मैं स्क्रैप कर रहा हूं, मेरी साइट से आ रहा है लेकिन हो सकता है कि मैं पर्याप्त जानकारी बनाने के लिए अन्य साइटों से डेटा प्राप्त कर सकूं। – hadees

संबंधित मुद्दे