acora הוא 'fgrep' לפייתון, מנוע חיפוש טקסט רב-מילות מפתח מהיר.
בהתבסס על קבוצה של מילות מפתח, שהוא מייצר אוטומט חיפוש (DFA) ומפעיל אותו על קלט מחרוזת, או Unicode או בתים.
Acora מבוסס על אלגוריתם אהו-Corasick ובניית Powerset NFA לDFA.
Acora מגיע עם שתי יישום פייתון טהור ומודול בינארי מהיר נכתב בCython.
כיצד אוכל להשתמש בו?
לייבא את החבילה:
>>> מAcoraBuilder יבוא acora
לאסוף כמה מילות מפתח:
>>> בונה = AcoraBuilder ('לפני הספירה' 'ab', 'דה')
>>> Builder.add ('', ב ')
צור מנוע חיפוש acora לקבוצה הנוכחית של מילות המפתח:
>>> AC = builder.build ()
חיפוש מחרוזת לכל המופעים:
>>> Ac.findall ('abc')
[(, 0 ''), ("ab", 0), (ב ', 1), (' לפני הספירה ", 1)]
>>> Ac.findall ("עבד ')
[(, 0 ''), ("ab", 0), (ב ', 1), (' דה ', 2)]
לחזר על תוצאות החיפוש כפי שהם באים ב:
>>> לקילוואט, קופה בac.finditer ("עבד '):
... הדפסה ("2s% [% d]"% (כ"ס, POS))
& Nbsp; [0]
ab [0]
& Nbsp; ב [1]
דה [2]
שאלות נפוצות ומתכונים
1. איך אני מפעיל את חיפוש חמדנים למילות מפתח ההתאמה הארוכה ביותר?
& Nbsp; >>> בונה = AcoraBuilder (, "ab '' ',' abc ')
& Nbsp; >>> AC = builder.build ()
& Nbsp; >>> לקילוואט, קופה בac.finditer ('abbabc'):
& Nbsp; ... הדפסה (כ"ס)
& Nbsp;
& Nbsp; ab
& Nbsp;
& Nbsp; ab
& Nbsp; abc
& Nbsp; >>> מitertools לייבא את חוליה ב
& Nbsp; >>> מitemgetter יבוא המפעיל
& Nbsp; >>> def longest_match (משחקים):
& Nbsp; ... לקופה, match_set בחוליה ב( גפרורים, itemgetter (1)):
& Nbsp; ... מקסימום תשואה (match_set)
& Nbsp; >>> לקילוואט, קופה בlongest_match (ac.finditer ('abbabc')):
& Nbsp; ... הדפסה (כ"ס)
& Nbsp; ab
& Nbsp; abc
2. איך אני לנתח את השורה אחר שורה, כfgrep עושה, אבל עם קצות קו שרירותיים?
& Nbsp; >>> def group_by_lines (ים, * מילות מפתח):
& Nbsp; ... בונה = AcoraBuilder ('r ', ' n ", * מילות מפתח)
& Nbsp; ... AC = builder.build ()
& Nbsp; ...
& Nbsp; ... current_line_matches = []
& Nbsp; ... last_ending = אין
& Nbsp; ...
& Nbsp; ... לקילוואט, קופה בac.finditer (ים):
& Nbsp; ... אם קילוואט ב'n r ':
& Nbsp; ... אם last_ending == ' r "וק"ו ==' n ':
& Nbsp; ... להמשיך # בשילוב CRLF
& Nbsp; ... tuple תשואה (current_line_matches)
& Nbsp; ... דל current_line_matches [:]
& Nbsp; ... = ק"ו last_ending
& Nbsp; ... אחר:
& Nbsp; ... last_ending = אין
& Nbsp; ... current_line_matches.append (כ"ס)
& Nbsp; ... tuple תשואה (current_line_matches)
& Nbsp; >>> kwds = [, 'לפני הספירה' 'ab', 'דה']
& Nbsp; >>> להתאמות בgroup_by_lines (" r r NBC r ndede n ללכוד את ', * kwds):
& Nbsp; ... הדפסה (גפרורים)
& Nbsp; ()
& Nbsp; ()
& Nbsp; ('לפני הספירה ",)
& Nbsp; ('דה', 'דה')
& Nbsp; ()
& Nbsp; ("ab",)
תכונות :
- עובד עם מחרוזות Unicode ומחרוזות בתים
- על 2-3x מהר ככל ביטוי המנוע הרגיל של פייתון עבור רוב הקלט
- מוצא חופף גפרורים, כלומר כל המשחקים של כל מילות המפתח
- תמיכה בחיפוש חסר רגישות מקרה (~ 10x מהר ככל 'מחדש')
- משחרר GIL תוך חיפוש
- נוסף יישום פייתון טהור (איטי אך קצר)
- תמיכה בפייתון 2.5+ ו3.x
- תמיכה לחיפוש בקבצים
- רישיון BSD מתירני
מה חדש בהודעה זו :
- תמיכה חמוץ למנועי חיפוש שנבנה מראש >
- optimisations ביצועים בבונה
- ניתוח Unicode הוא מותאם לפייתון 3.3, ומאוחר יותר
- כבר לא מבצע הידור מחדש של מקורות כאשר Cython מותקן, אלא אם כן --with-cython אפשרות מועברת לsetup.py (דורש Cython 0.20 +)
- לבנות נכשל עם גרסאות Cython האחרונות
- נבנה באמצעות Cython 0.20.1
מה חדש בגרסה 1.6:
- בניין באופן משמעותי מהר יותר אוטומט
- כבר לא כולל ריפו .hg בהפצת מקור
- נבנה באמצעות Cython 0.15 (rc0)
מה חדש בגרסת 1.5:
- בניית NFS-2-DFA Cython הידור פועלת באופן משמעותי מהר יותר
- תמיד לבנות מודולים סיומת גם אם Cython אינו מותקנת
- - לא לקמפל מתג בsetup.py למנוע בניית מודול הרחבה
- נבנה באמצעות Cython 0.14.1 (RC2)
מה חדש בגרסת 1.4 :
- מהיר עד קטין במנוע חיפוש לולאה פנימית >
- כמה ניקוי קוד
- נבנה באמצעות Cython 0.12.1 (סופיים)
דרישות :
- פייתון
תגובות לא נמצא