2010-03-02 25 views
17

Đối với một số mã dựa trên tìm kiếm (bằng Python), tôi cần viết một trình phân tích cú pháp truy vấn để phân tích một cú pháp truy vấn đơn giản như google. Ví dụ:Trình phân tích cú pháp python tốt cho truy vấn tìm kiếm giống như Google là gì?

tất cả những chữ "với cụm từ này" HOẶC rằng HOẶC trang web này: within.site filetype: ps từ: lastweek

Như tìm kiếm ngày càng trở nên một phổ biến hơn, tôi dự kiến ​​sẽ có thể dễ dàng tìm thấy một thư viện python để làm điều này và do đó tránh phải tái phát minh ra bánh xe. Đáng buồn thay, các tìm kiếm trên google không mang lại nhiều lợi nhuận.

Bạn sẽ đề xuất thư viện phân tích cú pháp python cho tác vụ đơn giản này?

+0

Bạn có thể muốn có một cái nhìn tại Apache Lucene . Theo hiểu biết của tôi, nó làm một cái gì đó khá giống nhau, mặc dù nó là trong Java, không phải Python (mặc dù bạn có thể giao tiếp với nó bằng cách sử dụng Jython). –

Trả lời

7

Trong khi ply là một cách tiếp cận cổ điển hơn (một biến thể Pythonic của lexx + yacc) và do đó có thể dễ dàng hơn để bắt đầu nếu bạn đã quen thuộc với các công cụ truyền thống như vậy, pyparsing rất cao và sẽ là đề xuất hàng đầu của tôi , đặc biệt đối với các tác vụ đơn giản như vậy (thực sự là lexing hơn là phân tích cú pháp "full-blown" ... ít nhất là cho đến khi bạn muốn cho phép các dấu ngoặc đơn có thể lồng nhau, nhưng pyparsing sẽ không thực sự gặp rắc rối bởi các ;-).

+2

Cảm ơn bạn đã cắm, Alex! Trang ví dụ pyparsing bao gồm một trình phân tích truy vấn tìm kiếm đơn giản (http://pyparsing.wikispaces.com/file/view/searchparser.py) và thư viện tìm kiếm Whoosh (http://whoosh.ca/) sử dụng pyparsing cho truy vấn của nó phân tích cú pháp. – PaulMcG

2

PLY thật tuyệt. Nó dựa trên thành ngữ Lex/Yacc và do đó có thể đã quen thuộc. Nó cho phép bạn tạo các trình phân tích cú pháp và trình phân tích cú pháp phức tạp tùy ý cho bất kỳ tác vụ nào, bao gồm cả công việc bạn cần.

Sử dụng công cụ mạnh mẽ như PLY thay vì đồ chơi đơn giản là một ý tưởng hay, vì nhu cầu của bạn có thể trở nên phức tạp hơn theo thời gian và bạn muốn ở cùng một công cụ.

3

SORRY - Lepl không còn được phát triển nữa.

Ngoài ra còn có LEPL - http://www.acooke.org/lepl

Dưới đây là một giải pháp nhanh chóng tôi đã viết trong bữa sáng:

 
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' 
>>> 

tôi cho rằng LEPL không phải là một "đồ chơi" - mặc dù nó là gốc đệ quy, nó bao gồm memoisation và trampolining, giúp tránh một số hạn chế của cách tiếp cận đó.

Tuy nhiên, nó là tinh khiết Python, vì vậy nó không phải siêu nhanh, và nó đang trong phát triển tích cực (một phiên bản mới, 4,0, với một vài sửa lỗi và cải tiến, đang đến tương đối sớm).

+0

LEPL không còn được phát triển: http://www.acooke.org/lepl/discontinued.html :( – Dave

+0

oh, vâng, tôi sẽ thêm nó vào thư trả lời (xin lỗi!) –

3

Một vài lựa chọn tốt:

  • bất ngờ tới thăm: vấn đề duy nhất là họ có vài ví dụ phân tích kể từ khi phân tích cú pháp có thể không phải tính năng chính của nó/lấy nét, nhưng nó chắc chắn là một lựa chọn tốt

  • modgrammar: Tôi đã không thử nó, nhưng có vẻ như khá linh hoạt và đơn giản

  • ply

  • pyparsing: được khuyến nghị. có một số ví dụ phân tích cú pháp tốt trực tuyến

Nếu bạn đã hoàn thành dự án, bạn đã chọn gì?

0

Tôi biết đây là câu hỏi cũ nhưng để tham khảo trong tương lai, tôi chỉ cần tải gói của mình searchstringparser lên PyPi. Thực hiện một máy phân tích cú pháp truy vấn thích hợp dựa trên ply. Nó xuất ra một chuỗi phù hợp với hàm tsquery của PostgreSQL. Bạn có thể xem các lớp lexer và parser để xem chúng có phù hợp với nhu cầu của bạn hay sửa đổi cho phù hợp hay không.

Phản hồi chào mừng!

2

PyParsing sẽ là lựa chọn đúng đắn, mặc dù khá tẻ nhạt, đó là lý do tại sao tôi đã phát triển trình phân tích truy vấn được lấy cảm hứng từ cú pháp lucene và gmail. Nó chỉ phụ thuộc là PyParsing, và chúng tôi đã sử dụng nó trên một số dự án. Nó hoàn toàn có thể tùy chỉnh và mở rộng, cộng với nó tóm tắt bạn từ các vấn đề pyparsing. Bạn có thể kiểm tra xem nó ra ở đây:

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

của nó khá tốt tài liệu, do đó bạn có thể tìm thấy tài liệu về cách làm các truy vấn, configs vv

+1

Điều gì có thể giúp là đẩy điều này trên Pipy :) – Guibod

Các vấn đề liên quan