linux系統下結巴分詞庫(cppjieba)的下載和應用

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下載

如果希望下載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文件夾下的內容如下圖所示:
build文件夾內容

編譯完成後,使用如下命令,即可運行其demo程序:

./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;
}

執行編譯後的程序,即可得到如下圖所示的結果,可以看到屏幕打印出了分詞的結果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章