Acora je "fgrep" pro Python, rychlý multi-klíčovým motorem textové vyhledávání.
Na sadě klíčových slov základě generuje vyhledávací automat (DFA) a spustí jej nad řetězec vstup, buď Unicode nebo bajtů.
Acora je založen na algoritmu Aho-Corasick a POWERSET konstrukci NFA-to-DFA.
Acora přichází s oběma čistě implementace Python a rychlý binární modul napsán v Cython.
Jak mohu použít?
Importovat balíček:
>>> Z acora import AcoraBuilder
Sbírat některá klíčová slova:
>>> Stavitel = AcoraBuilder ("ab", "bc", "de")
>>> Builder.add ('', 'b')
Generování vyhledávač Acora pro aktuální sadu klíčových slov:
>>> Ac = builder.build ()
Hledat řetězec pro všechny výskyty:
>>> Ac.findall ("abc")
[('', 0), ("ab", 0), ('b', 1), ("bc", 1)]
>>> Ac.findall ("Abde")
[('', 0), ("ab", 0), ('b', 1), ("de", 2)]
Iteraci přes výsledky vyhledávání tak, jak přicházejí v:
>>> For kW, pos v ac.finditer ("Abde"):
... Print ("% 2s [% d]"% (kw, pos))
& Nbsp; [0]
ab [0]
& Nbsp; b [1]
de [2]
FAQ a recepty
1. Jak mohu spustit chamtivý hledání nejdelších odpovídajících klíčových slov?
& Nbsp; >>> stavitel = AcoraBuilder ('', 'ab "," ABC ")
& Nbsp; >>> ac = builder.build ()
& Nbsp; >>> for kW, pos v ac.finditer ("abbabc"):
& Nbsp; ... print (kw)
& Nbsp;
& Nbsp; ab
& Nbsp;
& Nbsp; ab
& Nbsp; abc
& Nbsp; >>> z itertools importovat groupby
& Nbsp; >>> od operátora import itemgetter
& Nbsp; >>> def longest_match (zápasy):
& Nbsp; ... pro Pos, match_set v groupby (zápalky, itemgetter (1)):
& Nbsp; ... výnos max (match_set)
& Nbsp; >>> for kW, pos v longest_match (ac.finditer ("abbabc")):
& Nbsp; ... print (kw)
& Nbsp; ab
& Nbsp; abc
2. Jak mohu analyzovat řádek po řádku, jak fgrep dělá, ale s libovolnými konci řádků?
& Nbsp; >>> def group_by_lines (S, * keywords):
& Nbsp; ... stavitel = AcoraBuilder (' r', ' n', * klíčová slova)
& Nbsp; ... ac = builder.build ()
& Nbsp; ...
& Nbsp; ... current_line_matches = []
& Nbsp; ... last_ending = None
& Nbsp; ...
& Nbsp; ... pro kW, pos v ac.finditer (y):
& Nbsp; ... pokud kw v " r n":
& Nbsp; ... pokud last_ending == ' r' a kW == ' n':
& Nbsp; ... pokračovat # kombinaci CRLF
& Nbsp; ... výtěžek n-tice (current_line_matches)
& Nbsp; ... del current_line_matches [:]
& Nbsp; ... last_ending = kw
& Nbsp; ... jinak:
& Nbsp; ... last_ending = None
& Nbsp; ... current_line_matches.append (kw)
& Nbsp; ... výtěžek n-tice (current_line_matches)
& Nbsp; >>> kwds = ['ab', "bc", "de"]
& Nbsp; >>> pro zápasy v group_by_lines (" r r NBC r ndede n NAB ', * kwds):
& Nbsp; ... tiskové (zápasy)
& Nbsp; ()
& Nbsp; ()
& Nbsp; ("bc",)
& Nbsp; ("de", "de")
& Nbsp; ()
& Nbsp; ("ab",)
Vlastnosti :
- pracuje s unicode řetězce a bajtu řetězce
- asi 2-3x tak rychle, jak regulární výraz motor Python pro většinu vstupních
- najde překrývající utkání, tedy všechny zápasy všech klíčových slov
- podpora pro malá a velká písmena vyhledávání (~ 10x tak rychle, jak "znovu")
- osvobozuje Gil Během vyhledávání
- další (pomalý, ale krátký) čistý implementace Python
- Podpora pro Python 2.5+ a 3.x
- Podpora pro vyhledávání v souborech
- tolerantní BSD licence
Co je nového v této verzi:
- Podpora lák pro vyhledávače předpřipravených
- výkonnostní optimalizace v stavitel
- Unicode analýze je optimalizován pro Python 3.3 a novější
- již znovu zkompiluje zdroje, pokud je nainstalován Cython, pokud --with-cython volba je předán setup.py (vyžaduje Cython 0,20 +)
- Build se nezdařila s aktuálními verzemi Cython
- postavený s použitím Cython 0.20.1
Co je nového ve verzi 1.6:
- podstatně rychlejší automat budova
- již zahrnuje .hg repo ve zdrojové distribuci
- postavený s použitím Cython 0,15 (RC0)
Co je nového ve verzi 1.5:
- Cython zkompilovaný NFS-2-DFA výstavba probíhá podstatně rychlejší
- vždy stavět rozšiřujících modulů, i když není nainstalován Cython
- - no-kompilovat přepínač v setup.py, aby se zabránilo rozšíření modulu objekt
- postavený s použitím Cython 0.14.1 (RC2)
Co je nového ve verzi 1.4:
- menší rychlost-up ve vnitřní smyčce vyhledávače
- nějaký kód vyčištění
- postavený s použitím Cython 0.12.1 (v konečném znění)
Požadavky na :
- Python
Komentáře nebyl nalezen