mirror of
https://github.com/yanyiwu/cppjieba.git
synced 2025-07-18 00:00:12 +08:00
merge MPsegment.h/cpp into hpp
This commit is contained in:
parent
abfc3b4b6c
commit
6484342c8f
@ -1,7 +1,7 @@
|
||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
|
||||
|
||||
SET(LIBCPPJIEBA_SRC HMMSegment.cpp MixSegment.cpp MPSegment.cpp )
|
||||
SET(LIBCPPJIEBA_SRC HMMSegment.cpp MixSegment.cpp)
|
||||
ADD_LIBRARY(cppjieba STATIC ${LIBCPPJIEBA_SRC})
|
||||
ADD_EXECUTABLE(cjsegment segment.cpp)
|
||||
ADD_EXECUTABLE(cjserver server.cpp)
|
||||
|
@ -1,265 +0,0 @@
|
||||
/************************************
|
||||
* file enc : AISCII
|
||||
* author : wuyanyi09@gmail.com
|
||||
************************************/
|
||||
#include "MPSegment.h"
|
||||
|
||||
namespace CppJieba
|
||||
{
|
||||
|
||||
bool MPSegment::init(const char* const filePath)
|
||||
{
|
||||
if(_getInitFlag())
|
||||
{
|
||||
LogError("already inited before now.");
|
||||
return false;
|
||||
}
|
||||
if(!_trie.init())
|
||||
{
|
||||
LogError("_trie.init failed.");
|
||||
return false;
|
||||
}
|
||||
LogInfo("_trie.loadDict(%s) start...", filePath);
|
||||
if(!_trie.loadDict(filePath))
|
||||
{
|
||||
LogError("_trie.loadDict faield.");
|
||||
return false;
|
||||
}
|
||||
LogInfo("_trie.loadDict end.");
|
||||
return _setInitFlag(true);
|
||||
}
|
||||
|
||||
bool MPSegment::dispose()
|
||||
{
|
||||
if(!_getInitFlag())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
_trie.dispose();
|
||||
_setInitFlag(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MPSegment::cut(const string& str, vector<string>& res)const
|
||||
{
|
||||
return SegmentBase::cut(str, res);
|
||||
}
|
||||
|
||||
bool MPSegment::cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector<string>& res)const
|
||||
{
|
||||
if(!_getInitFlag())
|
||||
{
|
||||
LogError("not inited.");
|
||||
return false;
|
||||
}
|
||||
vector<TrieNodeInfo> segWordInfos;
|
||||
if(!cut(begin, end, segWordInfos))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
string tmp;
|
||||
for(uint i = 0; i < segWordInfos.size(); i++)
|
||||
{
|
||||
if(TransCode::encode(segWordInfos[i].word, tmp))
|
||||
{
|
||||
res.push_back(tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogError("encode failed.");
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MPSegment::cut(Unicode::const_iterator begin , Unicode::const_iterator end, vector<TrieNodeInfo>& segWordInfos)const
|
||||
{
|
||||
if(!_getInitFlag())
|
||||
{
|
||||
LogError("not inited.");
|
||||
return false;
|
||||
}
|
||||
SegmentContext segContext;
|
||||
for(Unicode::const_iterator it = begin; it != end; it++)
|
||||
{
|
||||
segContext.push_back(SegmentChar(*it));
|
||||
}
|
||||
|
||||
//calc DAG
|
||||
if(!_calcDAG(segContext))
|
||||
{
|
||||
LogError("_calcDAG failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!_calcDP(segContext))
|
||||
{
|
||||
LogError("_calcDP failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!_cut(segContext, segWordInfos))
|
||||
{
|
||||
LogError("_cut failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MPSegment::cut(const string& str, vector<TrieNodeInfo>& segWordInfos)const
|
||||
{
|
||||
if(!_getInitFlag())
|
||||
{
|
||||
LogError("not inited.");
|
||||
return false;
|
||||
}
|
||||
if(str.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Unicode sentence;
|
||||
|
||||
if(!TransCode::decode(str, sentence))
|
||||
{
|
||||
LogError("TransCode::decode failed.");
|
||||
return false;
|
||||
}
|
||||
return cut(sentence.begin(), sentence.end(), segWordInfos);
|
||||
|
||||
}
|
||||
|
||||
bool MPSegment::_calcDAG(SegmentContext& segContext)const
|
||||
{
|
||||
if(segContext.empty())
|
||||
{
|
||||
LogError("segContext empty.");
|
||||
return false;
|
||||
}
|
||||
|
||||
Unicode unicode;
|
||||
for(uint i = 0; i < segContext.size(); i++)
|
||||
{
|
||||
unicode.clear();
|
||||
for(uint j = i ; j < segContext.size(); j++)
|
||||
{
|
||||
unicode.push_back(segContext[j].uniCh);
|
||||
}
|
||||
|
||||
vector<pair<uint, const TrieNodeInfo*> > vp;
|
||||
if(_trie.find(unicode, vp))
|
||||
{
|
||||
for(uint j = 0; j < vp.size(); j++)
|
||||
{
|
||||
uint nextp = vp[j].first + i;
|
||||
segContext[i].dag[nextp] = vp[j].second;
|
||||
//cout<<vp[j].first<<endl;
|
||||
//LogDebug(vp[j].second->toString());
|
||||
}
|
||||
}
|
||||
if(segContext[i].dag.end() == segContext[i].dag.find(i))
|
||||
{
|
||||
segContext[i].dag[i] = NULL;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MPSegment::_calcDP(SegmentContext& segContext)const
|
||||
{
|
||||
if(segContext.empty())
|
||||
{
|
||||
LogError("segContext empty");
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int i = segContext.size() - 1; i >= 0; i--)
|
||||
{
|
||||
segContext[i].pInfo = NULL;
|
||||
segContext[i].weight = MIN_DOUBLE;
|
||||
for(DagType::const_iterator it = segContext[i].dag.begin(); it != segContext[i].dag.end(); it++)
|
||||
{
|
||||
uint nextPos = it->first;
|
||||
const TrieNodeInfo* p = it->second;
|
||||
double val = 0.0;
|
||||
if(nextPos + 1 < segContext.size())
|
||||
{
|
||||
val += segContext[nextPos + 1].weight;
|
||||
}
|
||||
|
||||
if(p)
|
||||
{
|
||||
val += p->logFreq;
|
||||
}
|
||||
else
|
||||
{
|
||||
val += _trie.getMinLogFreq();
|
||||
}
|
||||
if(val > segContext[i].weight)
|
||||
{
|
||||
segContext[i].pInfo = p;
|
||||
segContext[i].weight = val;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
bool MPSegment::_cut(SegmentContext& segContext, vector<TrieNodeInfo>& res)const
|
||||
{
|
||||
uint i = 0;
|
||||
while(i < segContext.size())
|
||||
{
|
||||
const TrieNodeInfo* p = segContext[i].pInfo;
|
||||
if(p)
|
||||
{
|
||||
res.push_back(*p);
|
||||
i += p->word.size();
|
||||
}
|
||||
else//single chinese word
|
||||
{
|
||||
TrieNodeInfo nodeInfo;
|
||||
nodeInfo.word.push_back(segContext[i].uniCh);
|
||||
nodeInfo.freq = 0;
|
||||
nodeInfo.logFreq = _trie.getMinLogFreq();
|
||||
res.push_back(nodeInfo);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef SEGMENT_UT
|
||||
using namespace CppJieba;
|
||||
|
||||
int main()
|
||||
{
|
||||
MPSegment segment;
|
||||
segment.init();
|
||||
if(!segment._loadSegDict("../dicts/segdict.gbk.v3.0"))
|
||||
{
|
||||
cerr<<"1"<<endl;
|
||||
return 1;
|
||||
}
|
||||
//segment.init("dicts/jieba.dict.utf8");
|
||||
//ifstream ifile("testtitle.gbk");
|
||||
ifstream ifile("badcase");
|
||||
vector<string> res;
|
||||
string line;
|
||||
while(getline(ifile, line))
|
||||
{
|
||||
res.clear();
|
||||
segment.cut(line, res);
|
||||
PRINT_VECTOR(res);
|
||||
getchar();
|
||||
}
|
||||
|
||||
segment.dispose();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
@ -1,49 +0,0 @@
|
||||
/************************************
|
||||
* file enc : ASCII
|
||||
* author : wuyanyi09@gmail.com
|
||||
************************************/
|
||||
#ifndef CPPJIEBA_MPSEGMENT_H
|
||||
#define CPPJIEBA_MPSEGMENT_H
|
||||
|
||||
#include <algorithm>
|
||||
#include <set>
|
||||
#include "Limonp/logger.hpp"
|
||||
#include "Trie.hpp"
|
||||
#include "globals.h"
|
||||
#include "ISegment.hpp"
|
||||
#include "SegmentBase.hpp"
|
||||
|
||||
namespace CppJieba
|
||||
{
|
||||
|
||||
typedef vector<SegmentChar> SegmentContext;
|
||||
|
||||
class MPSegment: public SegmentBase
|
||||
{
|
||||
private:
|
||||
Trie _trie;
|
||||
|
||||
public:
|
||||
MPSegment(){};
|
||||
virtual ~MPSegment(){dispose();};
|
||||
public:
|
||||
bool init(const char* const filePath);
|
||||
bool dispose();
|
||||
public:
|
||||
//bool cut(const string& str, vector<TrieNodeInfo>& segWordInfos)const;
|
||||
bool cut(const string& str, vector<string>& res)const;
|
||||
bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector<string>& res)const;
|
||||
bool cut(const string& str, vector<TrieNodeInfo>& segWordInfos)const;
|
||||
bool cut(Unicode::const_iterator begin , Unicode::const_iterator end, vector<TrieNodeInfo>& segWordInfos)const;
|
||||
//virtual bool cut(const string& str, vector<string>& res)const;
|
||||
|
||||
private:
|
||||
bool _calcDAG(SegmentContext& segContext)const;
|
||||
bool _calcDP(SegmentContext& segContext)const;
|
||||
bool _cut(SegmentContext& segContext, vector<TrieNodeInfo>& res)const;
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
254
src/MPSegment.hpp
Normal file
254
src/MPSegment.hpp
Normal file
@ -0,0 +1,254 @@
|
||||
/************************************
|
||||
* file enc : ASCII
|
||||
* author : wuyanyi09@gmail.com
|
||||
************************************/
|
||||
#ifndef CPPJIEBA_MPSEGMENT_H
|
||||
#define CPPJIEBA_MPSEGMENT_H
|
||||
|
||||
#include <algorithm>
|
||||
#include <set>
|
||||
#include "Limonp/logger.hpp"
|
||||
#include "Trie.hpp"
|
||||
#include "globals.h"
|
||||
#include "ISegment.hpp"
|
||||
#include "SegmentBase.hpp"
|
||||
|
||||
namespace CppJieba
|
||||
{
|
||||
|
||||
typedef vector<SegmentChar> SegmentContext;
|
||||
|
||||
class MPSegment: public SegmentBase
|
||||
{
|
||||
private:
|
||||
Trie _trie;
|
||||
|
||||
public:
|
||||
MPSegment(){};
|
||||
virtual ~MPSegment(){dispose();};
|
||||
public:
|
||||
bool init(const char* const filePath)
|
||||
{
|
||||
if(_getInitFlag())
|
||||
{
|
||||
LogError("already inited before now.");
|
||||
return false;
|
||||
}
|
||||
if(!_trie.init())
|
||||
{
|
||||
LogError("_trie.init failed.");
|
||||
return false;
|
||||
}
|
||||
LogInfo("_trie.loadDict(%s) start...", filePath);
|
||||
if(!_trie.loadDict(filePath))
|
||||
{
|
||||
LogError("_trie.loadDict faield.");
|
||||
return false;
|
||||
}
|
||||
LogInfo("_trie.loadDict end.");
|
||||
return _setInitFlag(true);
|
||||
}
|
||||
bool dispose()
|
||||
{
|
||||
if(!_getInitFlag())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
_trie.dispose();
|
||||
_setInitFlag(false);
|
||||
return true;
|
||||
}
|
||||
public:
|
||||
//bool cut(const string& str, vector<TrieNodeInfo>& segWordInfos)const;
|
||||
bool cut(const string& str, vector<string>& res)const
|
||||
{
|
||||
return SegmentBase::cut(str, res);
|
||||
}
|
||||
bool cut(Unicode::const_iterator begin, Unicode::const_iterator end, vector<string>& res)const
|
||||
{
|
||||
if(!_getInitFlag())
|
||||
{
|
||||
LogError("not inited.");
|
||||
return false;
|
||||
}
|
||||
vector<TrieNodeInfo> segWordInfos;
|
||||
if(!cut(begin, end, segWordInfos))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
string tmp;
|
||||
for(uint i = 0; i < segWordInfos.size(); i++)
|
||||
{
|
||||
if(TransCode::encode(segWordInfos[i].word, tmp))
|
||||
{
|
||||
res.push_back(tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogError("encode failed.");
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool cut(const string& str, vector<TrieNodeInfo>& segWordInfos)const
|
||||
{
|
||||
if(!_getInitFlag())
|
||||
{
|
||||
LogError("not inited.");
|
||||
return false;
|
||||
}
|
||||
if(str.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Unicode sentence;
|
||||
|
||||
if(!TransCode::decode(str, sentence))
|
||||
{
|
||||
LogError("TransCode::decode failed.");
|
||||
return false;
|
||||
}
|
||||
return cut(sentence.begin(), sentence.end(), segWordInfos);
|
||||
|
||||
}
|
||||
bool cut(Unicode::const_iterator begin , Unicode::const_iterator end, vector<TrieNodeInfo>& segWordInfos)const
|
||||
{
|
||||
if(!_getInitFlag())
|
||||
{
|
||||
LogError("not inited.");
|
||||
return false;
|
||||
}
|
||||
SegmentContext segContext;
|
||||
for(Unicode::const_iterator it = begin; it != end; it++)
|
||||
{
|
||||
segContext.push_back(SegmentChar(*it));
|
||||
}
|
||||
|
||||
//calc DAG
|
||||
if(!_calcDAG(segContext))
|
||||
{
|
||||
LogError("_calcDAG failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!_calcDP(segContext))
|
||||
{
|
||||
LogError("_calcDP failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!_cut(segContext, segWordInfos))
|
||||
{
|
||||
LogError("_cut failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
//virtual bool cut(const string& str, vector<string>& res)const;
|
||||
|
||||
private:
|
||||
bool _calcDAG(SegmentContext& segContext)const
|
||||
{
|
||||
if(segContext.empty())
|
||||
{
|
||||
LogError("segContext empty.");
|
||||
return false;
|
||||
}
|
||||
|
||||
Unicode unicode;
|
||||
for(uint i = 0; i < segContext.size(); i++)
|
||||
{
|
||||
unicode.clear();
|
||||
for(uint j = i ; j < segContext.size(); j++)
|
||||
{
|
||||
unicode.push_back(segContext[j].uniCh);
|
||||
}
|
||||
|
||||
vector<pair<uint, const TrieNodeInfo*> > vp;
|
||||
if(_trie.find(unicode, vp))
|
||||
{
|
||||
for(uint j = 0; j < vp.size(); j++)
|
||||
{
|
||||
uint nextp = vp[j].first + i;
|
||||
segContext[i].dag[nextp] = vp[j].second;
|
||||
//cout<<vp[j].first<<endl;
|
||||
//LogDebug(vp[j].second->toString());
|
||||
}
|
||||
}
|
||||
if(segContext[i].dag.end() == segContext[i].dag.find(i))
|
||||
{
|
||||
segContext[i].dag[i] = NULL;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool _calcDP(SegmentContext& segContext)const
|
||||
{
|
||||
if(segContext.empty())
|
||||
{
|
||||
LogError("segContext empty");
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int i = segContext.size() - 1; i >= 0; i--)
|
||||
{
|
||||
segContext[i].pInfo = NULL;
|
||||
segContext[i].weight = MIN_DOUBLE;
|
||||
for(DagType::const_iterator it = segContext[i].dag.begin(); it != segContext[i].dag.end(); it++)
|
||||
{
|
||||
uint nextPos = it->first;
|
||||
const TrieNodeInfo* p = it->second;
|
||||
double val = 0.0;
|
||||
if(nextPos + 1 < segContext.size())
|
||||
{
|
||||
val += segContext[nextPos + 1].weight;
|
||||
}
|
||||
|
||||
if(p)
|
||||
{
|
||||
val += p->logFreq;
|
||||
}
|
||||
else
|
||||
{
|
||||
val += _trie.getMinLogFreq();
|
||||
}
|
||||
if(val > segContext[i].weight)
|
||||
{
|
||||
segContext[i].pInfo = p;
|
||||
segContext[i].weight = val;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
bool _cut(SegmentContext& segContext, vector<TrieNodeInfo>& res)const
|
||||
{
|
||||
uint i = 0;
|
||||
while(i < segContext.size())
|
||||
{
|
||||
const TrieNodeInfo* p = segContext[i].pInfo;
|
||||
if(p)
|
||||
{
|
||||
res.push_back(*p);
|
||||
i += p->word.size();
|
||||
}
|
||||
else//single chinese word
|
||||
{
|
||||
TrieNodeInfo nodeInfo;
|
||||
nodeInfo.word.push_back(segContext[i].uniCh);
|
||||
nodeInfo.freq = 0;
|
||||
nodeInfo.logFreq = _trie.getMinLogFreq();
|
||||
res.push_back(nodeInfo);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
@ -1,7 +1,7 @@
|
||||
#ifndef CPPJIEBA_MIXSEGMENT_H
|
||||
#define CPPJIEBA_MIXSEGMENT_H
|
||||
|
||||
#include "MPSegment.h"
|
||||
#include "MPSegment.hpp"
|
||||
#include "HMMSegment.h"
|
||||
#include "Limonp/str_functs.hpp"
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include "Limonp/ArgvContext.hpp"
|
||||
#include "MPSegment.h"
|
||||
#include "MPSegment.hpp"
|
||||
#include "HMMSegment.h"
|
||||
#include "MixSegment.h"
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
#include "Limonp/Config.hpp"
|
||||
#include "Husky/Daemon.h"
|
||||
#include "Husky/ServerFrame.h"
|
||||
#include "MPSegment.h"
|
||||
#include "MPSegment.hpp"
|
||||
#include "HMMSegment.h"
|
||||
#include "MixSegment.h"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user