18

一部の検索ベースのコード(Python)では、クエリ構文のような単純なグーグルを解析するクエリ構文パーサーを作成する必要があります。例えば:

これらすべての単語「withthisphrase」またはthatORthis site:within.site filetype:ps from:lastweek

検索の人気が高まるにつれ、これを行うためのPythonライブラリを簡単に見つけることができるようになり、車輪の再発明を行う必要がなくなると期待していました。悲しいことに、グーグルでの検索はあまり得られません。

この単純なタスクのPython解析ライブラリとして何をお勧めしますか?

4

7 に答える 7

8

より古典的なアプローチ( lexx ply+ yaccのPythonicバリアント)であるため、このような従来のツールに既に精通している場合は、開始するのが簡単かもしれませんが、構文解析は非常にpythonicであり、特にこのような単純な場合は、私の一番の推奨事項です。タスク(これは、「本格的な」構文解析よりも実際には字句解析に似ています...少なくとも、入れ子になった可能性のある括弧を許可するまでは、実際にはそれらによって問題が発生することはありません;-)。

于 2010-03-02T18:57:44.393 に答える
4

いくつかの良いオプション:

  • おっと:唯一の問題は、パーサーがその主な機能/焦点ではない可能性があるため、構文解析の例がほとんどないことですが、それは間違いなく良いオプションです

  • modgrammar:試していませんが、かなり柔軟でシンプルなようです

  • プライ

  • pyparsing:強くお勧めします。オンラインでいくつかの良い構文解析の例があります

プロジェクトが終了した場合、最終的に何を選択しましたか?

于 2014-06-30T18:27:05.663 に答える
3

申し訳ありませんが、Leplはもう開発されていません。

LEPLもあります-http ://www.acooke.org/lepl

これが私が朝食中に書いた簡単な解決策です:

pl6 src:python3                                                      
Python 3.1(r31:73572、2009年10月24日、05:39:09)                         
[GCC 4.4.1[gcc-4_4-ブランチリビジョン150839]](linux2)                
詳細については、「help」、「copyright」、「credits」、または「license」と入力してください。
>>>leplインポートから*                                                
>>>                                                                   
>>>クラスAlternatives(Node):                                         
... パス                                                          
..。
>>>クラスQuery(Node):
... パス
..。
>>>クラスText(Node):
... パス
..。
>>> def compile():
...修飾子=Word()&Drop(':')>'修飾子'
... word =〜Lookahead('OR')&Word()
...フレーズ=String()
...テキスト=フレーズ| 語
... word_or_phrase =(Optional(qualifier)&text)>テキスト
...スペース=Drop(Space()[1:])
... query = word_or_phrase [1 :、スペース]>クエリ
...セパレータ=Drop(space&'OR'&space)
... Alternatives = query [:、separator]> Alternatives
... Alternatives.string_parser()を返します
..。
>>>パーサー=compile()
>>>
>>> Alternatives = parser('これらの単語すべて"このフレーズ付き"'
...'またはそれまたはこのサイト:within.site'
...'filetype:ps from:lastweek')[0]
>>>
>>> print(str(alternatives))
代替案
 +-クエリ
 | +-テキスト
 | | `-'すべて'
 | +-テキスト
 | | `-'の'
 | +-テキスト
 | | `-'これら'
 | +-テキスト
 | | `-'言葉'
 | `-テキスト
 | `-'このフレーズで'
 +-クエリ
 | `-テキスト
 | `-'それ'
 `-クエリ
     +-テキスト
     | `-'これ'
     +-テキスト
     | +-修飾子'サイト'
     | `-'within.site'
     +-テキスト
     | +-修飾子'filetype'
     | `-'ps'
     `-テキスト
         +-修飾子'from'
         `-'先週'
>>>

LEPLは「おもちゃ」ではないと主張します。再帰下降ですが、メモ化とトランポリンが含まれているため、このアプローチの制限の一部を回避できます。

ただし、これは純粋なPythonであるため、超高速ではなく、活発に開発されています(かなりの数の修正と改善が加えられた、新しいリリース4.0が比較的間もなく登場します)。

于 2010-03-03T12:19:12.137 に答える
3

PyParsingは正しい選択ですが、非常に面倒ですが、それがluceneとgmailの構文に着想を得たクエリパーサーを開発した理由です。依存関係はPyParsingだけであり、いくつかのプロジェクトで使用しています。それは完全にカスタマイズ可能で拡張可能であり、さらにそれはpyparsingの問題からあなたを抽象化します。あなたはここでそれをチェックすることができます:

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

それはかなりよく文書化されているので、クエリ、構成などを行う方法に関するドキュメントを見つけることができます。

于 2016-05-24T18:59:25.490 に答える
2

PLYは素晴らしいです。これはLex/Yaccイディオムに基づいているため、すでにおなじみの可能性があります。これにより、必要なタスクを含め、任意のタスクに対して任意の複雑なレクサーとパーサーを作成できます。

単純なおもちゃの代わりにPLYのような強力なツールを使用することをお勧めします。これは、時間の経過とともにニーズがより複雑になる可能性があり、同じツールを使用したいためです。

于 2010-03-02T16:23:06.427 に答える
1

これは古い質問ですが、今後の参考のために、パッケージsearchstringparserPyPiにアップロードしました。これは、 plyに基づいた適切なクエリ解析機構を実装しています。PostgreSQL関数tsqueryに適した文字列を出力します。レクサークラスとパーサークラスを調べて、それらがニーズに合っているかどうかを確認したり、それに応じて変更したりできます。

フィードバックを歓迎します!

于 2015-09-29T17:56:07.020 に答える
0

Whooshには、包括的な検索クエリパーサーモジュールwhoosh.qparserとクラスQueryParserがあり、ユースケースに簡単に適応できるはずです。

http://pythonhosted.org/Whoosh/parsing.htmlおよびhttps://bitbucket.org/mchaput/whoosh/src/55f9c484047a8306101c8eaa59e9a110f960a1c2/src/whoosh/qparserを参照してください

于 2013-08-20T09:40:15.040 に答える