2010-03-02 7 views
17

일부 검색 기반 코드 (Python)에서는 검색어 구문과 같은 간단한 Google 구문을 구문 분석 할 쿼리 구문 분석기를 작성해야합니다. 예를 들면 :Google과 유사한 검색 쿼리를위한 훌륭한 파이썬 파서는 무엇입니까?

하거나 또는이 사이트에 "이 구절에"이 단어의 모든 : 파일 형식 within.site : PS에서 : 지난주, 지난

검색이 종료 더 인기 해짐에 따라, I 이 일을하기 위해 파이썬 라이브러리를 쉽게 찾을 수 있기를 기대하며 따라서 휠을 다시 발명해야하는 번거 로움을 피할 수 있습니다. 슬프게도 Google 검색은 수익을 많이 내지 않습니다.

이 간단한 작업을 위해 파이썬 파싱 라이브러리로 무엇을 권하고 싶습니까?

+0

당신은 아파치 루씬을 살펴 할 수 있습니다 . 필자가 이해할 수 있듯이 파이썬이 아니라 자바와 유사하지만 (자바 스크립트를 사용하여 인터페이스 할 수는 있지만) 비슷한 기능을 수행합니다. –

답변

7

ply은 고전적인 접근법 (lexx + yacc의 Python 변형)이기 때문에 기존 도구에 익숙하다면 더 쉽게 시작할 수 있습니다. pyparsing은 고도의 파이썬으로 내 최고의 권장 사항입니다. 특히 간단한 작업 (특히 "본격적인"파싱보다 렉싱에 더 가깝습니다 ... 적어도 네가 중첩 된 괄호를 허용 할 때까지는 그렇지만 파싱은 실제로는 문제가되지 않을 것입니다.

+2

플러그에 감사드립니다, Alex! pyparsing 예제 페이지는 간단한 검색 쿼리 파서 (http://pyparsing.wikispaces.com/file/view/searchparser.py)를 포함하고 있으며, Whoosh 검색 라이브러리 (http://whoosh.ca/)는 쿼리에 pyparsing을 사용합니다 파싱. – PaulMcG

2

PLY 위대한입니다. 이것은 Lex/Yacc 관용구를 기반으로하므로 익숙 할 수 있습니다. 필요한 작업을 포함하여 임의의 작업에 대해 임의로 복잡한 렉서 및 파서를 만들 수 있습니다.

간단한 장난감 대신 PLY와 같은 강력한 도구를 사용하는 것이 좋습니다. 시간이 갈수록 복잡해지고 동일한 도구를 사용하기를 원하기 때문입니다.

3

SORRY - Lepl은 더 이상 개발되지 않습니다.

도 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는 "장난감"아니라고 주장

- 그것은 재귀 하강은 비록, 그것은 포함 memoisation 및 trampolining, 그 접근 방식의 한계를 피하는 데 도움이됩니다.

그러나 순수 Python이기 때문에 초고속이 아니며 적극적으로 개발되고 있습니다 (새 릴리스, 4.0, 몇 가지 수정 및 개선이 비교적 빨리 예정되어 있습니다).

+0

LEPL은 더 이상 개발되지 않습니다. http://www.acooke.org/lepl/discontinued.html :( – Dave

+0

오, 예, 답장에 추가하겠습니다 (죄송합니다.) –

3

몇 가지 좋은 옵션을 참조하십시오 :

  • 붕 : 유일한 문제는 파서의 주요 기능/초점하지 않을 수 있기 때문에 그들이 몇 파싱 예제를 가지고 있지만,이 점입니다 확실히 좋은 옵션

  • modgrammar : 나는 그것을 시도하지 못했지만, 꽤 유연하고 단순한 것

  • 플라이

  • 파이핑 : 적극 권장합니다. 좋은 파싱 예제가 온라인에 있습니다.

프로젝트가 끝나면 무엇을 선택하게 되었습니까?

0

나는 이것이 이전 질문이지만 나중에 참조 용으로 searchstringparserPyPi에 올렸습니다. ply을 기반으로 적절한 구문 분석 기계를 구현합니다. PostgreSQL 함수 tsquery에 적합한 문자열을 출력합니다. 렉서 및 파서 클래스를보고 자신의 필요에 맞는 것인지 또는 그에 맞게 수정하는지 확인할 수 있습니다.

의견 환영!

2

PyParsing은 올바른 선택이 될 수 있지만 매우 지루한데, lucene 및 gmail 구문에 영감을 얻은 쿼리 구문 분석기를 개발 한 이유입니다. PyParsing 만 의존성이며 여러 프로젝트에서 사용했습니다. 그것은 완벽하게 사용자 정의 가능하고 확장 가능하며, 또한 pyparsing 문제에서 당신을 추상화합니다. 당신은 여기에서 확인할 수 있습니다 :

당신이 등을 질의, CONFIGS을 수행하는 방법에 대한 문서를 찾을 수 있도록 자사의 꽤 잘 설명

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

+1

무엇이 도움이 될 수 있습니까? Pipy :) – Guibod

관련 문제