日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【NLP】darmatch: 一个非常高效的多模式字符串匹配工具

發布時間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NLP】darmatch: 一个非常高效的多模式字符串匹配工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

darmatch 是一個非常高效的字符串匹配工具,支持正向/反向最大匹配分詞和多模式字符串精確匹配:

  • 僅包含頭文件 (header-only)

  • 基于雙數組字典樹 (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?=?"俄羅斯聯邦總統普京決定在頓巴斯地區開展特別軍事行動。";/*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("俄羅斯聯邦總統");//?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 進行編譯:

git?clone?https://github.com/zejunwang1/darmatch cd?darmatch mkdir?build && cd build cmake?.. #?cmake?-DUSE_PREFIX_TRIE=ON?.. make

執行上述命令后,會在 darmatch/build 文件夾中生成可執行文件 test。

./test?--dict_path?../tests/dict.txt

運行后結果如下:

The?Chinese?word?segmentation?based?on?Maximum?Forward?Matching:? 俄羅斯聯邦?總統?普京?決定?在?頓巴斯地區?開展?特別?軍事行動?。? The?Chinese?word?segmentation?based?on?Maximum?Backward?Matching:? 俄羅斯?聯邦總統?普京?決定?在?頓巴斯地區?開展?特別?軍事行動?。? The?result?of?multi-pattern?string?matching:? 0????俄羅斯聯邦 0????俄羅斯聯邦總統 9????聯邦總統 21????普京 27????決定 36????頓巴斯地區 51????開展 63????軍事行動

Python

Requirements

  • Python version >= 3.6

  • pybind11 >= 2.2

  • setuptools >= 0.7.0

  • typing

Installation

通過 pip 命令直接安裝:

pip?install?darmatch

或者從 github 倉庫中獲取最新版本安裝:

git?clone?https://github.com/zejunwang1/darmatch cd?darmatch pip?install?. #?or: python?setup.py?install

Demo

from?darmatch?import?DarMatch da?=?DarMatch() #?da?=?DarMatch(dict_path,?user_dict_path="") words?=?["俄羅斯聯邦",?"聯邦總統",?"普京",?"決定",?"頓巴斯地區",?"開展",?"軍事行動"] da.insert(words) text?=?"俄羅斯聯邦總統普京決定在頓巴斯地區開展特別軍事行動。"#?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("俄羅斯聯邦總統") word_list?=?da.parse(text,?char_loc=True) print("The?result?of?multi-pattern?string?matching:") print(word_list)

運行結果如下:

The?Chinese?word?segmentation?based?on?Maximum?Forward?Matching: [(0,?'俄羅斯聯邦'),?(5,?'總統'),?(7,?'普京'),?(9,?'決定'),?(11,?'在'),?(12,?'頓巴斯地區'),?(17,?'開展'),?(19,?'特別'),?(21,?'軍事行動'),?(25,?'。')] The?Chinese?word?segmentation?based?on?Maximum?Backward?Matching: [(0,?'俄羅斯'),?(3,?'聯邦總統'),?(7,?'普京'),?(9,?'決定'),?(11,?'在'),?(12,?'頓巴斯地區'),?(17,?'開展'),?(19,?'特別'),?(21,?'軍事行動'),?(25,?'。')] The?result?of?multi-pattern?string?matching: [(0,?'俄羅斯聯邦'),?(0,?'俄羅斯聯邦總統'),?(3,?'聯邦總統'),?(7,?'普京'),?(9,?'決定'),?(12,?'頓巴斯地區'),?(17,?'開展'),?(21,?'軍事行動')]

Speed

和基于 Aho-Corasick 的字符串匹配正則表達式工具 esmre 進行處理速度對比。可以使用 pip 命令安裝 esmre:

pip?install?esmre

在 tests 文件夾中包含字符串匹配需要用到的關鍵詞詞典文件 string_match_dict.txt,共計有 348982 個關鍵詞。待進行匹配的文本字符串文件 check_text.txt,共計有 273864 個字符。

python?test_speed.py

運行后結果如下:

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

往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:

總結

以上是生活随笔為你收集整理的【NLP】darmatch: 一个非常高效的多模式字符串匹配工具的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。