Что такое хороший парсер python для поискового запроса, подобного google?
для некоторого кода на основе поиска (в Python) мне нужно написать синтаксический анализатор запросов, который будет анализировать простой синтаксис запросов google. Например:
все эти слова "с этой фразой" Или тот или этот сайт: внутри.сайт тип файла: ps from: lastweek
поскольку поиск становится более популярным, я ожидал, что смогу легко найти библиотеку python для этого и, таким образом, избежать необходимости заново изобретать колесо. К сожалению, поиск в google не много дают.
Что бы вы рекомендовали в качестве библиотеки синтаксического анализа python для этой простой задачи?
7 ответов
While ply
является более классическим подходом (Питонический вариант lexx + yacc) и, таким образом, может быть проще начать работу, если вы уже знакомы с такими традиционными инструментами,pyparsing очень pythonic и будет моей главной рекомендацией, особенно для таких простых задач (которые действительно больше похожи на лексику, чем на "полномасштабный" разбор... по крайней мере, пока вы не захотите разрешить возможно-вложенные скобки, но pyparsing на самом деле не будет беспокоить их;-).
извините-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 не является "игрушкой" - хотя это рекурсивный спуск, он включает в себя мемуаризацию и батут, которые помогают избежать некоторых ограничений этого подхода.
однако это чистый Python, поэтому он не супер-быстрый, и он находится в активная разработка (новая версия 4.0, с довольно большим количеством исправлений и улучшений, приходит относительно скоро).
несколько хороших вариантов:
Whoosh: единственная проблема в том, что у них есть несколько примеров синтаксического анализа, так как парсер не может быть его главной особенностью/фокусом, но это определенно хороший вариант
modgrammar: я не пробовал, но это кажется довольно гибким и простым
ply
когда pyparsing: настоятельно рекомендуется. есть несколько хороших примеров синтаксического анализа в интернете
Если вы закончили с проектом, что вы в конечном итоге выбрали?
PLY это здорово. Он основан на идиоме Lex/Yacc и, таким образом, может быть уже знаком. Он позволяет создавать произвольно сложные лексеры и парсеры для любой задачи, в том числе и для той, которая вам нужна.
использование мощного инструмента, такого как PLY, вместо простой игрушки-хорошая идея, потому что ваши потребности могут стать более сложными со временем, и вы хотели бы остаться с тем же инструментом.
PyParsing был бы правильным выбором, хотя это довольно утомительно, поэтому я разработал парсер запросов, вдохновленный синтаксисом lucene и gmail. Это только зависимость-PyParsing, и мы использовали ее в нескольких проектах. Он полностью настраивается и расширяется, а также абстрагирует вас от проблем с pyparsing. Вы можете проверить это здесь:
http://www.github.com/sebastiandev/plyse
его довольно хорошо документировано, поэтому вы найдете документы о том, как это сделать запросы, конфигурации и т. д.
Whoosh имеет комплексный модуль синтаксического анализа запросов поиска whoosh.qparser и класс QueryParser, который должен быть достаточно легко адаптироваться к вашему случаю использования.
см.http://pythonhosted.org/Whoosh/parsing.html и https://bitbucket.org/mchaput/whoosh/src/55f9c484047a8306101c8eaa59e9a110f960a1c2/src/whoosh/qparser
Я знаю, что это старый вопрос, но для дальнейшего использования я просто загрузил свой пакет searchstringparser to PyPi. Который реализует достойный механизм разбора запросов на основе ply. Он выводит строку, подходящую для функции PostgreSQL tsquery. Вы можете посмотреть классы lexer и parser, чтобы увидеть, соответствуют ли они вашим потребностям или соответствующим образом изменяются.
обратная связь добро пожаловать!