Что такое хороший анализатор python для поискового запроса в Google?

Для некоторого кода на основе поиска (в Python) мне нужно написать синтаксический анализатор синтаксиса запроса, который будет анализировать простой синтаксис запроса Google, подобный запросу. Например:

все эти слова "с этой фразой" ИЛИ что ИЛИ этот сайт: inside.site filetype: ps от: lastweek

По мере того, как поиск становится более популярным, я ожидал, что вы сможете легко найти библиотеку python для этого и, таким образом, не придется повторно изобретать колесо. К сожалению, поиски в google не дают многого.

Что вы порекомендовали бы в качестве библиотеки разбора python для этой простой задачи?

Ответы

Ответ 1

В то время как ply является более классическим подходом (питоновский вариант lexx + yacc) и, следовательно, с ним легче начать, если вы уже знакомы с такими традиционными инструментами, pyparsing является очень pythonic и будет моей главной рекомендацией, особенно для таких простых задач (которые в действительности больше похожи на lexing, чем на "полномасштабный" синтаксический анализ... по крайней мере, пока вы не захотите чтобы возможно вложенные круглые скобки, но pyparsing на самом деле не беспокоит их: -).

Ответ 2

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, с довольно небольшим количеством исправлений и улучшений, будет относительно скоро).

Ответ 3

Несколько хороших вариантов:

  • Whoosh: единственная проблема заключается в том, что у них мало примеров синтаксического анализа, поскольку парсер может не быть его главной функцией/фокусом, но это определенно хороший вариант

  • modgrammar: я не пробовал, но кажется довольно гибким и простым

  • слойные

  • pyparsing: настоятельно рекомендуется. есть несколько хороших примеров синтаксического анализа онлайн

Если вы закончили работу над проектом, что вы выбрали?

Ответ 4

PLY отлично. Он основан на идиоме Lex/Yacc и, возможно, уже знаком. Это позволяет создавать произвольно сложные лексеры и синтаксические анализаторы для любой задачи, включая ту, которая вам нужна.

Использование мощного инструмента, такого как PLY вместо простой игрушки, является хорошей идеей, потому что ваши потребности могут со временем усложняться, и вы хотите остаться с одним и тем же инструментом.

Ответ 5

PyParsing был бы правильным выбором, хотя он довольно утомительный, поэтому я разработал синтаксический анализатор запросов, основанный на синтаксисе lucene и gmail. Это только зависимость PyParsing, и мы использовали ее для нескольких проектов. Он полностью настраиваемый и расширяемый, плюс он абстрагирует вас от проблем, связанных с пирарированием. Вы можете проверить это здесь:

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

Его довольно хорошо документировано, поэтому вы найдете документы о том, как выполнять запросы, конфиги и т.д.

Ответ 7

Я знаю, что это старый вопрос, но для будущей ссылки я просто загрузил свой пакет searchstringparser в PyPi. Который реализует приличный механизм анализа запросов на основе ply. Он выводит строку, подходящую для функции tgquery PostgreSQL. Вы можете посмотреть классы lexer и parser, чтобы узнать, соответствуют ли они вашим потребностям или соответствующим образом изменяют.

Обратная связь приветствуем!