【NLP】darmatch: 一个非常高效的多模式字符串匹配工具
darmatch 是一個(gè)非常高效的字符串匹配工具,支持正向/反向最大匹配分詞和多模式字符串精確匹配:
僅包含頭文件 (header-only)
基于雙數(shù)組字典樹 (double-array trie) 的模式匹配
支持 C++ 和 Python
GitHub:?
https://github.com/zejunwang1/darmatch
C++
使用示例可以參考 tests 文件夾中的 test.cpp:
#include?<iostream> #include?<darmatch.h>int?main(int?argc,?char**?argv)?{std::vector<std::string>?args(argv,?argv?+?argc);std::string?dict_path,?user_dict_path;for?(int?i?=?1;?i?<?args.size();?i?+=?2)?{if?(args[i]?==?"--dict_path")?{dict_path?=?std::string(args.at(i?+?1));}?else?if?(args[i]?==?"--user_dict_path")?{user_dict_path?=?std::string(args.at(i?+?1));}?else?{std::cout?<<?"Unknown?argument:?"?<<?args[i]?<<?std::endl;std::cout?<<?"Supported?argument:?--dict_path?--user_dict_path"?<<?std::endl;exit(EXIT_FAILURE);}}/*initialization?methods:darmatch::DarMatch?da;darmatch::DarMatch?da(dict_path,?user_dict_path?=?"");*/darmatch::DarMatch?da(dict_path,?user_dict_path);std::string?text?=?"俄羅斯聯(lián)邦總統(tǒng)普京決定在頓巴斯地區(qū)開展特別軍事行動(dòng)。";/*maximum?forward?matching:std::vector<std::pair<size_t,?std::string>>?fwords?=?da.seg(text);----------------------------------------------std::vector<std::pair<size_t,?std::string>>?fwords;da.seg(text,?fwords);*/std::vector<std::pair<size_t,?std::string>>?fwords?=?da.seg(text);std::cout?<<?"The?Chinese?word?segmentation?based?on?Maximum?Forward?Matching:?"?<<?std::endl;for?(size_t?i?=?0;?i?<?fwords.size();?i++)?{std::cout?<<?fwords[i].second?<<?"?";}std::cout?<<?std::endl;/*maximum?backward?matching:std::vector<std::pair<size_t,?std::string>>?bwords?=?da.seg(text,?false);------------------------------------------------------std::vector<std::pair<size_t,?std::string>>?bwords;da.seg(text,?bwords,?false);*/std::vector<std::pair<size_t,?std::string>>?bwords?=?da.seg(text,?false);std::cout?<<?"The?Chinese?word?segmentation?based?on?Maximum?Backward?Matching:?"?<<?std::endl;for?(size_t?i?=?0;?i?<?bwords.size();?i++)?{std::cout?<<?bwords[i].second?<<?"?";}std::cout?<<?std::endl;/*update?the?double-array?trie?by?insert:da.insert(const?std::string&);da.insert(const?std::vector<std::string>&);*/da.insert("俄羅斯聯(lián)邦總統(tǒng)");//?multi-pattern?string?matchingstd::vector<std::pair<size_t,?std::string>>?result?=?da.parse(text);std::cout?<<?"The?result?of?multi-pattern?string?matching:?"?<<?std::endl;for?(size_t?i?=?0;?i?<?result.size();?i++)?{std::cout?<<?result[i].first?<<?"\t"?<<?result[i].second?<<?std::endl;?}return?0; }通過 cmake 進(jìn)行編譯:
git?clone?https://github.com/zejunwang1/darmatch cd?darmatch mkdir?build && cd build cmake?.. #?cmake?-DUSE_PREFIX_TRIE=ON?.. make執(zhí)行上述命令后,會(huì)在 darmatch/build 文件夾中生成可執(zhí)行文件 test。
./test?--dict_path?../tests/dict.txt運(yùn)行后結(jié)果如下:
The?Chinese?word?segmentation?based?on?Maximum?Forward?Matching:? 俄羅斯聯(lián)邦?總統(tǒng)?普京?決定?在?頓巴斯地區(qū)?開展?特別?軍事行動(dòng)?。? The?Chinese?word?segmentation?based?on?Maximum?Backward?Matching:? 俄羅斯?聯(lián)邦總統(tǒng)?普京?決定?在?頓巴斯地區(qū)?開展?特別?軍事行動(dòng)?。? The?result?of?multi-pattern?string?matching:? 0????俄羅斯聯(lián)邦 0????俄羅斯聯(lián)邦總統(tǒng) 9????聯(lián)邦總統(tǒng) 21????普京 27????決定 36????頓巴斯地區(qū) 51????開展 63????軍事行動(dòng)Python
Requirements
Python version >= 3.6
pybind11 >= 2.2
setuptools >= 0.7.0
typing
Installation
通過 pip 命令直接安裝:
pip?install?darmatch或者從 github 倉(cāng)庫(kù)中獲取最新版本安裝:
git?clone?https://github.com/zejunwang1/darmatch cd?darmatch pip?install?. #?or: python?setup.py?installDemo
from?darmatch?import?DarMatch da?=?DarMatch() #?da?=?DarMatch(dict_path,?user_dict_path="") words?=?["俄羅斯聯(lián)邦",?"聯(lián)邦總統(tǒng)",?"普京",?"決定",?"頓巴斯地區(qū)",?"開展",?"軍事行動(dòng)"] da.insert(words) text?=?"俄羅斯聯(lián)邦總統(tǒng)普京決定在頓巴斯地區(qū)開展特別軍事行動(dòng)。"#?maximum?forward?matching word_list?=?da.seg(text,?forward=True,?return_loc=True) print("The?Chinese?word?segmentation?based?on?Maximum?Forward?Matching:") print(word_list)#?maximum?backward?matching word_list?=?da.seg(text,?forward=False,?return_loc=True) print("The?Chinese?word?segmentation?based?on?Maximum?Backward?Matching:") print(word_list)#?multi-pattern?string?matching da.insert("俄羅斯聯(lián)邦總統(tǒng)") word_list?=?da.parse(text,?char_loc=True) print("The?result?of?multi-pattern?string?matching:") print(word_list)運(yùn)行結(jié)果如下:
The?Chinese?word?segmentation?based?on?Maximum?Forward?Matching: [(0,?'俄羅斯聯(lián)邦'),?(5,?'總統(tǒng)'),?(7,?'普京'),?(9,?'決定'),?(11,?'在'),?(12,?'頓巴斯地區(qū)'),?(17,?'開展'),?(19,?'特別'),?(21,?'軍事行動(dòng)'),?(25,?'。')] The?Chinese?word?segmentation?based?on?Maximum?Backward?Matching: [(0,?'俄羅斯'),?(3,?'聯(lián)邦總統(tǒng)'),?(7,?'普京'),?(9,?'決定'),?(11,?'在'),?(12,?'頓巴斯地區(qū)'),?(17,?'開展'),?(19,?'特別'),?(21,?'軍事行動(dòng)'),?(25,?'。')] The?result?of?multi-pattern?string?matching: [(0,?'俄羅斯聯(lián)邦'),?(0,?'俄羅斯聯(lián)邦總統(tǒng)'),?(3,?'聯(lián)邦總統(tǒng)'),?(7,?'普京'),?(9,?'決定'),?(12,?'頓巴斯地區(qū)'),?(17,?'開展'),?(21,?'軍事行動(dòng)')]Speed
和基于 Aho-Corasick 的字符串匹配正則表達(dá)式工具 esmre 進(jìn)行處理速度對(duì)比。可以使用 pip 命令安裝 esmre:
pip?install?esmre在 tests 文件夾中包含字符串匹配需要用到的關(guān)鍵詞詞典文件 string_match_dict.txt,共計(jì)有 348982 個(gè)關(guān)鍵詞。待進(jìn)行匹配的文本字符串文件 check_text.txt,共計(jì)有 273864 個(gè)字符。
python?test_speed.py運(yùn)行后結(jié)果如下:
the?number?of?matching?results?by?esm:??343623 esm?time?usage:?0.4515085220336914s ---------------------------------------------------- the?number?of?matching?results?by?darmatch:??343623 darmatch?time?usage:?0.1248319149017334s121s可以看出,darmatch 比 esm 快 3~4 倍左右。
Contact
郵箱:wangzejunscut@126.com
微信:autonlp
總結(jié)
以上是生活随笔為你收集整理的【NLP】darmatch: 一个非常高效的多模式字符串匹配工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea 快捷键代码行标记并快捷跳到标记
- 下一篇: 任意门怎么用团发_衣柜门选用什么材料好?