Что такое хороший анализатор 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
Его довольно хорошо документировано, поэтому вы найдете документы о том, как выполнять запросы, конфиги и т.д.
Ответ 6
У Who есть комплексный синтаксический анализатор поисковых запросов whoosh.qparser и класс QueryParser, который должен быть легко адаптирован к вашему прецеденту.
См. http://pythonhosted.org/Whoosh/parsing.html и https://bitbucket.org/mchaput/whoosh/src/55f9c484047a8306101c8eaa59e9a110f960a1c2/src/whoosh/qparser
Ответ 7
Я знаю, что это старый вопрос, но для будущей ссылки я просто загрузил свой пакет searchstringparser в PyPi. Который реализует приличный механизм анализа запросов на основе ply. Он выводит строку, подходящую для функции tgquery PostgreSQL. Вы можете посмотреть классы lexer и parser, чтобы узнать, соответствуют ли они вашим потребностям или соответствующим образом изменяют.
Обратная связь приветствуем!