2010-03-02 10 views
17

कुछ खोज-आधारित कोड (पायथन में) के लिए, मुझे एक क्वेरी सिंटैक्स पार्सर लिखना होगा जो एक सरल Google जैसे क्वेरी सिंटैक्स को पार्स करेगा। उदाहरण के लिए:Google जैसी खोज क्वेरी के लिए एक अच्छा पायथन पार्सर क्या है?

इन शब्दों या कि या इस साइट "इस वाक्यांश के साथ" के सभी: filetype within.site: ps से: lastweek

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

इस सरल कार्य के लिए आपको अजगर पार्सिंग लाइब्रेरी के रूप में क्या सलाह दी जाएगी?

+0

आप अपाचे Lucene पर एक नज़र लेने के लिए चाहते हो सकता है । मेरी समझ के लिए, यह कुछ समान है, हालांकि यह जावा में है, पायथन नहीं (हालांकि आप ज्योथन का उपयोग कर इसके साथ इंटरफ़ेस कर सकते हैं)। –

उत्तर

7

जबकि ply एक अधिक शास्त्रीय दृष्टिकोण (Lexx + याक की एक pythonic संस्करण) है और इस तरह आसानी के साथ करता है, तो आप इस तरह के परंपरागत उपकरणों के साथ पहले से ही परिचित हैं आरंभ करने के लिए हो सकता है, pyparsing अत्यधिक pythonic है और मेरी शीर्ष सिफारिश होगा , विशेष रूप से ऐसे सरल कार्यों के लिए (जो वास्तव में "पूर्ण उड़ा" पार्सिंग की तुलना में लेक्सिंग की तरह अधिक हैं ... कम से कम जब तक आप संभावित रूप से नेस्टेड कोष्ठक की अनुमति नहीं देना चाहते हैं, लेकिन पाइपर्सिंग वास्तव में उन लोगों द्वारा परेशान नहीं होगी ;-)।

+2

प्लग के लिए धन्यवाद, एलेक्स! pyparsing उदाहरण पेज एक सरल खोज प्रश्न पार्सर (http://pyparsing.wikispaces.com/file/view/searchparser.py) भी शामिल है, और हूँश खोज पुस्तकालय (http://whoosh.ca/) ने अपनी क्वेरी के लिए pyparsing का उपयोग करता है पार्स करने। – PaulMcG

2

PLY बहुत अच्छा है। यह लेक्स/वाईएसीसी मुहावरे पर आधारित है और इस प्रकार पहले ही परिचित हो सकता है। यह आपको किसी भी कार्य के लिए मनमाने ढंग से जटिल लेक्सर्स और पार्सर्स बनाने की अनुमति देता है, जिसमें आपको आवश्यकता है।

एक साधारण खिलौने की बजाय पीएलवाई जैसे शक्तिशाली उपकरण का उपयोग करना एक अच्छा विचार है, क्योंकि आपकी ज़रूरतें समय के साथ और अधिक जटिल हो सकती हैं और आप उसी टूल के साथ रहना चाहेंगे।

3

सोरी - लीप्ल अब विकसित नहीं किया जा रहा है।

वहाँ भी LEPL है - http://www.acooke.org/lepl

यहां एक त्वरित समाधान मैं नाश्ते के दौरान लिखा है:

 
pl6 src: python3              
Python 3.1 (r31:73572, Oct 24 2009, 05:39:09)       
[GCC 4.4.1 [gcc-4_4-branch revision 150839]] on linux2     
Type "help", "copyright", "credits" or "license" for more information. 
>>> from lepl import *             
>>>                 
>>> class Alternatives(Node):           
...  pass               
... 
>>> class Query(Node): 
...  pass 
... 
>>> class Text(Node): 
...  pass 
... 
>>> def compile(): 
...  qualifier  = Word() & Drop(':')   > 'qualifier' 
...  word   = ~Lookahead('OR') & Word() 
...  phrase   = String() 
...  text   = phrase | word 
...  word_or_phrase = (Optional(qualifier) & text) > Text 
...  space   = Drop(Space()[1:]) 
...  query   = word_or_phrase[1:, space] > Query 
...  separator  = Drop(space & 'OR' & space) 
...  alternatives = query[:, separator]   > Alternatives 
...  return alternatives.string_parser() 
... 
>>> parser = compile() 
>>> 
>>> alternatives = parser('all of these words "with this phrase" ' 
...      'OR that OR this site:within.site ' 
...      'filetype:ps from:lastweek')[0] 
>>> 
>>> print(str(alternatives)) 
Alternatives 
+- Query 
| +- Text 
| | `- 'all' 
| +- Text 
| | `- 'of' 
| +- Text 
| | `- 'these' 
| +- Text 
| | `- 'words' 
| `- Text 
|  `- 'with this phrase' 
+- Query 
| `- Text 
|  `- 'that' 
`- Query 
    +- Text 
    | `- 'this' 
    +- Text 
    | +- qualifier 'site' 
    | `- 'within.site' 
    +- Text 
    | +- qualifier 'filetype' 
    | `- 'ps' 
    `- Text 
     +- qualifier 'from' 
     `- 'lastweek' 
>>> 

मैं तर्क था कि LEPL एक "खिलौना" नहीं है - हालांकि यह पुनरावर्ती वंश है, यह भी शामिल है ज्ञापन और trampolining, जो उस दृष्टिकोण की कुछ सीमाओं से बचने में मदद करते हैं।

हालांकि, यह शुद्ध पायथन है, इसलिए यह सुपर-फास्ट नहीं है, और यह सक्रिय विकास में है (एक नई रिलीज, 4.0, कुछ फिक्स और सुधार के साथ, अपेक्षाकृत जल्द ही आ रहा है)।

+0

LEPL नहीं रह गया है विकसित किया जा रहा है: http://www.acooke.org/lepl/discontinued.html :( – Dave

+0

ओह, हाँ, मुझे लगता है कि उत्तर के लिए जोड़ देंगे (! खेद) –

0

हूश के पास एक व्यापक खोज क्वेरी पार्सर मॉड्यूल है जोश.कपर्सर और क्लास क्वेरीपार्सर है जो आपके उपयोग के मामले में अनुकूलित करने के लिए उचित रूप से आसान होना चाहिए।

http://pythonhosted.org/Whoosh/parsing.html और https://bitbucket.org/mchaput/whoosh/src/55f9c484047a8306101c8eaa59e9a110f960a1c2/src/whoosh/qparser

3

कुछ अच्छा विकल्प देखें:

  • हूँश: समस्या सिर्फ वे कुछ पार्स उदाहरण है के बाद से पार्सर इसकी मुख्य विशेषता/फोकस नहीं हो सकता है, लेकिन यह है कि है निश्चित रूप से एक अच्छा विकल्प

  • modgrammar: मैं यह कोशिश नहीं की है, लेकिन यह बहुत लचीला और सरल लगता है

  • प्लाई

  • पाइपर्सिंग: अत्यधिक अनुशंसित। कुछ अच्छे पार्सिंग उदाहरण ऑनलाइन हैं

यदि आप परियोजना के साथ काम कर रहे हैं, तो आपने क्या चुना है?

0

मुझे पता है कि यह एक पुराना सवाल है लेकिन भविष्य के संदर्भ के लिए मैंने अभी अपना पैकेज searchstringparserPyPi पर अपलोड किया है। जो ply पर आधारित एक सभ्य क्वेरी पार्सिंग मशीनरी लागू करता है। यह PostgreSQL फ़ंक्शन tsquery के लिए उपयुक्त एक स्ट्रिंग आउटपुट करता है। आप यह देखने के लिए लेक्सर और पार्सर कक्षाओं को देख सकते हैं कि वे आपकी ज़रूरत के अनुरूप हैं या तदनुसार संशोधित हैं।

प्रतिक्रिया आपका स्वागत है!

2

पाइपरिंग सही विकल्प होगा, हालांकि काफी कठिन है, इसलिए मैंने ल्यूसीन और जीमेल सिंटैक्स से प्रेरित एक क्वेरी पार्सर विकसित किया है। यह केवल निर्भरता है PyParsing, और हमने इसे कई परियोजनाओं पर उपयोग किया है। यह पूरी तरह से अनुकूलन योग्य और विस्तार योग्य है, साथ ही यह आपको पाइपर्सिंग मुद्दों से अलग करता है। आप यहाँ यह बाहर की जाँच कर सकते हैं:

http://www.github.com/sebastiandev/plyse

इसकी बहुत अच्छी तरह से प्रलेखित तो आप कैसे क्वेरी, कॉन्फ़िगरेशन, आदि करने के लिए पर डॉक्स मिल जाएगा

+1

क्या मदद कर सकता है यह पुश करने के लिए है पापी पर :) – Guibod

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