أداة مطابقة واستبدال الكلمات الرئيسية عالية الأداء.
تم تنفيذه بواسطة cython، وسيتم تجميعه إلى cpp. بنية بيانات trie هي cedar، وهي عبارة عن مصفوفة مزدوجة محسنة. وهو يدعم Python2.7 و3.4+. وهو يدعم المخلل لتفريغ وتحميل.
إذا وجدت هذا مفيدًا، فيرجى إعطاء نجمة!
هذه الوحدة مكتوبة بلغة سايثون. تحتاج إلى تثبيت سايثون.
pip install cyac
ثم قم بإنشاء Trie
>>> from cyac import Trie
>>> trie = Trie()
إضافة/الحصول على/إزالة الكلمة الرئيسية
>>> trie.insert(u"哈哈") # return keyword id in trie, return -1 if doesn't exist
>>> trie.get(u"哈哈") # return keyword id in trie, return -1 if doesn't exist
>>> trie.remove(u"呵呵") # return keyword in trie
>>> trie[id] # return the word corresponding to the id
>>> trie[u"呵呵"] # similar to get but it will raise exeption if doesn't exist
>>> u"呵呵" in trie # test if the keyword is in trie
الحصول على جميع الكلمات الرئيسية
>>> for key, id_ in trie.items():
>>> print(key, id_)
البادئة/ التنبؤ
>>> # return the string in the trie which starts with given string
>>> for id_ in trie.predict(u"呵呵"):
>>> print(id_)
>>> # return the prefix of given string which is in the trie.
>>> for id_, len_ in trie.prefix(u"呵呵"):
>>> print(id_, len_)
حاول استخراج، استبدال
>>> python_id = trie.insert(u"python")
>>> trie.replace_longest("python", {python_id: u"hahah"}, set([ord(" ")])) # the second parameter is seperator. If you specify seperators. it only matches strings tween seperators. e.g. It won't match 'apython'
>>> for id_, start, end in trie.match_longest(u"python", set([ord(" ")])):
>>> print(id_, start, end)
مستخلص أهو كوراسيك
>>> ac = AC.build([u"python", u"ruby"])
>>> for id, start, end in ac.match(u"python ruby"):
>>> print(id, start, end)
تصدير إلى ملف، ثم يمكننا استخدام mmap لتحميل الملف ومشاركة البيانات بين العمليات.
>>> ac = AC.build([u"python", u"ruby"])
>>> ac.save("filename")
>>> ac.to_buff(buff_object)
الحرف الأول من بايثون المخزن المؤقت
>>> import mmap
>>> with open("filename", "r+b") as bf:
buff_object = mmap.mmap(bf.fileno(), 0)
>>> AC.from_buff(buff_object, copy=True) # it allocs new memory
>>> AC.from_buff(buff_object, copy=False) # it shares memory
مثال متعدد العمليات
import mmap
from multiprocessing import Process
from cyac import AC
def get_mmap():
with open("random_data", "r+b") as bf:
buff_object = mmap.mmap(bf.fileno(), 0)
ac_trie = AC.from_buff(buff_object, copy=False)
# Do your aho searches here. "match" function is process safe.
processes_list = list()
for x in range(0, 6):
p = Process(
target=get_mmap,
)
p.start()
processes_list.append(p)
for p in processes_list:
p.join()
لمزيد من المعلومات حول المعالجة المتعددة وتحليل الذاكرة في cyac، راجع هذه المشكلة.
تعتبر وظيفة "المطابقة" في جهاز التيار المتردد الآلي آمنة للخيط/العملية. من الممكن العثور على تطابقات بالتوازي مع جهاز AC آلي مشترك، ولكن لا يمكن كتابة/إلحاق الأنماط به.
على Ubuntu 14.04.5/Intel(R) Core(TM) i7-4790K CPU @ 4.00 جيجا هرتز.
بالمقارنة مع HatTrie، فإن محور الأفق هو رقم رمزي. يستخدم المحور الرأسي الوقت (بالثواني).
مقارنة مع flashText. التعبير العادي بطيء جدًا في هذه المهمة (راجع العلامة المميزة لـ flashText). محور الأفق هو رقم الحرف المراد مطابقته. يستخدم المحور الرأسي الوقت (بالثواني).
مقارنةً بـ pyahocorasick، فإن محور الأفق هو رقم الحرف الذي يجب مطابقته. يستخدم المحور الرأسي الوقت (بالثواني).
>>> len(char.lower()) == len(char) # this is always true in python2, but not in python3
>>> len(u"İstanbul") != len(u"İstanbul".lower()) # in python3
في حالة المطابقة غير الحساسة، تعتني هذه المكتبة بالحقيقة وترجع الإزاحة الصحيحة.
python setup.py build
PYTHONPATH= $( pwd ) /build/BUILD_DST python3 tests/test_all.py
PYTHONPATH= $( pwd ) /build/BUILD_DST python3 bench/bench_ * .py