Acora on "fgrep" Python, nopea usean avainsanateksti hakukone.
Perustuen avainsanoja, se tuottaa haku automaatti (DFA) ja kulkee sen yli string input, joko Unicode tai tavua.
Acora perustuu Aho-Corasick algoritmi ja NFA-to-DFA Powerset rakentamiseen.
Acora on sekä puhdas Python täytäntöönpano ja nopea binary moduuli kirjoitettu Cython.
Miten käytän sitä?
Tuo paketti:
>>> Alkaen acora tuonti AcoraBuilder
Kerää joitakin avainsanoja:
>>> Rakennusmestari = AcoraBuilder (ab ',' bc ',' de ')
>>> Builder.add ('', 'b')
Luo Acora hakukone nykyisen avainsanajoukon:
>>> Ac = builder.build ()
Etsi merkkijono kaikissa tapauksissa:
>>> Ac.findall ("abc")
[('', 0), ("ab", 0), ('b', 1), ('bc', 1)]
>>> Ac.findall ('ABDE')
[('', 0), ("ab", 0), ('b', 1), ('de', 2)]
Kerrata yli hakutulokset kuin ne tulevat:
>>> For kw, pos in ac.finditer ('ABDE'):
... Print ("% 2s [% d]"% (kw, pos))
& Nbsp; [0]
ab [0]
& Nbsp; b [1]
de [2]
UKK ja reseptit
1. Miten luon ahne etsiä pisimpään matching avainsanat?
& Nbsp; >>> rakennusmestari = AcoraBuilder ('', 'ab', 'abc')
& Nbsp; >>> ac = builder.build ()
& Nbsp; >>> varten kw, pos in ac.finditer ('abbabc'):
& Nbsp; ... print (kw)
& Nbsp;
& Nbsp; ab
& Nbsp;
& Nbsp; ab
& Nbsp; abc
& Nbsp; >>> alkaen itertools tuoda groupby
& Nbsp; >>> operaattorilta tuonti itemgetter
& Nbsp; >>> def longest_match (ottelut):
& Nbsp; ... ja pos, match_set vuonna groupby (ottelut, itemgetter (1)):
& Nbsp; ... tuotto max (match_set)
& Nbsp; >>> varten kw, pos vuonna longest_match (ac.finditer ('abbabc')):
& Nbsp; ... print (kw)
& Nbsp; ab
& Nbsp; abc
2. Miten voin jäsentää linja-by-line, kuten fgrep tekee, mutta mielivaltainen linja päätteitä?
& Nbsp; >>> def group_by_lines (s, * avainsanat):
& Nbsp; ... rakennusmestari = AcoraBuilder (' r', ' n', * avainsanat)
& Nbsp; ... ac = builder.build ()
& Nbsp; ...
& Nbsp; ... current_line_matches = []
& Nbsp; ... last_ending = None
& Nbsp; ...
& Nbsp; ... for kw, pos vuonna ac.finditer (t):
& Nbsp; ... jos kw in ' r n ":
& Nbsp; ... jos last_ending == ' r' ja kw == ' n':
& Nbsp; ... jatka # yhdistetty CRLF
& Nbsp; ... tuotto monikko (current_line_matches)
& Nbsp; ... del current_line_matches [:]
& Nbsp; ... last_ending = kw
& Nbsp; ... muuten:
& Nbsp; ... last_ending = None
& Nbsp; ... current_line_matches.append (kw)
& Nbsp; ... tuotto monikko (current_line_matches)
& Nbsp; >>> kwds = ['ab', 'bc', 'de']
& Nbsp; >>> otteluiden group_by_lines (' r r nbc r ndede n napata ", * kwds):
& Nbsp; ... print (ottelut)
& Nbsp; ()
& Nbsp; ()
& Nbsp; ("bc",)
& Nbsp; ("de", "de ')
& Nbsp; ()
& Nbsp; ("ab",)
Ominaisuudet
- toimii unicode jouset ja tavu jouset
- noin 2-3x niin nopeasti kuin Pythonin säännöllinen lauseke moottorin suurimman input
- löytää päällekkäisiä ottelut, eli kaikki ottelut kaikkien avainsanojen
- tuen kirjainkoko hakuun (~ 10x niin nopeasti kuin "uudelleen")
- vapauttaa GIL etsiessään
- lisää (hidas mutta lyhyt) puhdasta Python täytäntöönpano
- Python 2.5+ ja 3.x
- tukeminen hakuja tiedostoja
- sallivan BSD-lisenssi
Mikä on uusi tässä julkaisussa:
- suolakurkku tukea valmiiksi rakennettu hakukoneita li >
- suorituskyvyn optimointeja rakennusmestari
- Unicode jäsennys on optimoitu Python 3.3 ja myöhemmin
- ei enää recompiles lähteitä kun Cython on asennettu, ellei --with-cython vaihtoehto johdetaan setup.py (vaatii Cython 0,20 +)
- rakentaa epäonnistui viime Cython versioiden
- rakennettu Cython 0.20.1
Mikä on uusi versiossa 1.6:
- huomattavasti nopeammin automaatin rakennus
- ei enää sisällä .hg repo vuonna lähde jakeluverkon
- rakennettu Cython 0.15 (RC0)
Mikä on uusi versiossa 1.5:
- Cython koottu NFS-2-DFA rakentamisen toimii huomattavasti nopeammin
- aina rakentaa laajennusmoduulit vaikka Cython ei ole asennettu
- - no-koota kytkin setup.py estää laajennusmoduulissa rakennus
- rakennettu Cython 0.14.1 (RC2)
Mikä on uusi versiossa 1.4:
- pienet nopeus-up in sisempi hakukoneen loop
- koodia uudelleenjärjestäminen
- rakennettu Cython 0.12.1 (lopullinen)
vaatimukset
- Python
Kommentteja ei löytynyt