linux系統下結巴分詞庫(cppjieba)的下載和應用
本文詳細介紹linux系統下結巴分詞庫(cppjieba)的下載編譯以及在c++項目中使用。操作過程全部由作者測試實現。作者的系統環境如下:
- linux操作系統:CentOS 7
- linux內核版本:3.10.0-327.el7.x86_64(命令$uname -r查看)
- g++版本:g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)
- cmake版本:cmake version 2.8.12.2
cppjieba的下載
在linux系統可以訪問互聯網的前提下,可以在指定文件夾下執行下列命令,從而將cppjieba的軟件包下載到本地該文件夾下:
git clone –depth=10 –branch=master git://github.com/yanyiwu/cppjieba.git
下載後的結果如下圖所示:
如果希望下載cppjieba的軟件包的打包文件也可以直接點擊網址:GitHub-yanyiwu/cppjieba,然後點擊“Clone or download”下載壓縮包即可。
cppjieba的編譯和測試
在cppjieba的GitHub下載界面可以看到,其依賴軟件爲:
- g++ (version >= 4.1 is recommended) or clang++;
- cmake (version >= 2.6 is recommended);
使用git命令下載好cppjieba軟件包並確保本地軟件符合上述要求之後,執行下列命令對其進行編譯:
cd cppjieba
mkdir build
cd build
cmake ..
make
編譯完成後build文件夾下的內容如下圖所示:
編譯完成後,使用如下命令,即可運行其demo程序:
./demo
運行之後結果如下圖所示:
cppjieba在c++項目中的應用
上述運行的demo程序源程序位於“cppjieba\test”中,根據該demo程序及其結果,可以發現要使用結巴分詞庫進行分詞,首先需要創建cppjieba::Jieba對象,創建時需要傳入相關詞典的路徑信息。然後使用創建的cppjieba::Jieba進行不同類型的分詞操作。
下面展示在一個c++項目中應用結巴分詞庫cppjieba的具體過程:
方便起見,我們將結巴分詞庫的使用封裝成一個WordSegmentation類,並將其聲明和實現均放在“WordSegmentation.hpp”文件中。WordSegmentation.hpp文件的內容如下:
#ifndef _MY_WORD_SEGMENTATION_H_
#define _MY_WORD_SEGMENTATION_H_
#include "cppjieba/Jieba.hpp"
#include <iostream>
#include <string>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
const char * const DICT_PATH = "/home/long361/jieba/cppjieba/dict/jieba.dict.utf8";//最大概率法(MPSegment: Max Probability)分詞所使用的詞典路徑
const char * const HMM_PATH = "/home/long361/jieba/cppjieba/dict/hmm_model.utf8";//隱式馬爾科夫模型(HMMSegment: Hidden Markov Model)分詞所使用的詞典路徑
const char * const USER_DICT_PATH = "/home/long361/jieba/cppjieba/dict/user.dict.utf8";//用戶自定義詞典路徑
const char* const IDF_PATH = "/home/long361/jieba/cppjieba/dict/idf.utf8";//IDF路徑
const char* const STOP_WORD_PATH = "/home/long361/jieba/cppjieba/dict/stop_words.utf8";//停用詞路徑
class WordSegmentation//使用結巴分詞庫進行分詞
{
public:
WordSegmentation()
: _jieba(DICT_PATH, HMM_PATH, USER_DICT_PATH,IDF_PATH,STOP_WORD_PATH)//初始化Jieba類對象
{
cout << "cppjieba init!" << endl;
}
vector<string> operator()(const string str)//返回str的分詞結果
{
vector<string> words;
_jieba.CutAll(str, words);//FullSegment
return words;
}
private:
cppjieba::Jieba _jieba;
};
#endif
這裏只封裝了cppjieba::Jieba類中的一個CutAll函數用作演示。需要注意的是,需要將cppjieba軟件包中的文件夾“cppjieba\include\cppjieba”放到該頭文件所在的文件夾下。另外,由於cppjieba中的頭文件”QuerySegment.hpp“包含了文件夾“cppjieba\deps\limonp\”中頭文件的內容,因此可以直接將該limonp文件夾也複製到c++項目中cppjieba文件夾中,即可解決這一問題。如果爲複製limonp文件夾,則在程序編譯時可能會出現下圖所示的情況:
下面是測試程序test_jieba.cpp中的內容:
#include"WordSegmentation.hpp"
#include<iostream>
#include<string>
#include<vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main()
{
string str="結巴分詞庫的下載和應用";
WordSegmentation wordSeg;
vector<string> results=wordSeg(str);
cout<<"分詞結果如下:"<<endl;
for(auto it=results.begin();it!=results.end();++it)
{
cout<<*it<<" ";
}
return 0;
}
執行編譯後的程序,即可得到如下圖所示的結果,可以看到屏幕打印出了分詞的結果: