mirror of
https://github.com/yanyiwu/cppjieba.git
synced 2025-07-18 00:00:12 +08:00
add findMaxMatch and cutMM
This commit is contained in:
parent
0200ff1d01
commit
f2c5f571f2
51
Segment.cpp
51
Segment.cpp
@ -20,6 +20,54 @@ namespace CppJieba
|
|||||||
return _trie.destroy();
|
return _trie.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Segment::cutMM(const string& chStr, vector<string>& res)
|
||||||
|
{
|
||||||
|
res.clear();
|
||||||
|
char logBuf[bufSize];
|
||||||
|
char utfBuf[bufSize];
|
||||||
|
ChUnicode uniStr[bufSize];
|
||||||
|
memset(uniStr, 0, sizeof(uniStr));
|
||||||
|
size_t len = utf8ToUnicode(chStr.c_str(), chStr.size(), uniStr);
|
||||||
|
|
||||||
|
if(0 == len)
|
||||||
|
{
|
||||||
|
sprintf(logBuf, "utf8ToUnicode [%s] failed!", chStr.c_str());
|
||||||
|
LogError(logBuf);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sizeof(uniStr) - len <= 5)
|
||||||
|
{
|
||||||
|
sprintf(logBuf, "%s too long!", chStr.c_str());
|
||||||
|
LogError(logBuf);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while(i < len)
|
||||||
|
{
|
||||||
|
cout<<__FILE__<<__LINE__<<i<<endl;
|
||||||
|
int pos = _trie.findMaxMatch(uniStr + i, len - i);
|
||||||
|
if(-1 != pos)
|
||||||
|
{
|
||||||
|
int utfLen = unicodeToUtf8(uniStr + i, pos, utfBuf);
|
||||||
|
if(0 == utfLen)
|
||||||
|
{
|
||||||
|
LogError("unicodeToUtf8 failed!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
res.push_back(utfBuf);
|
||||||
|
|
||||||
|
i += pos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Segment::cutRMM(const string& chStr, vector<string>& res)
|
bool Segment::cutRMM(const string& chStr, vector<string>& res)
|
||||||
{
|
{
|
||||||
res.clear();
|
res.clear();
|
||||||
@ -42,7 +90,6 @@ namespace CppJieba
|
|||||||
LogError(logBuf);
|
LogError(logBuf);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int i = len - 1;
|
int i = len - 1;
|
||||||
while(i >= 0)
|
while(i >= 0)
|
||||||
@ -85,7 +132,7 @@ int main()
|
|||||||
segment.init("dict.utf8");
|
segment.init("dict.utf8");
|
||||||
vector<string> res;
|
vector<string> res;
|
||||||
string title = "我来到北京清华大学3D电视";
|
string title = "我来到北京清华大学3D电视";
|
||||||
bool flag = segment.cutRMM(title, res);
|
bool flag = segment.cutMM(title, res);
|
||||||
if(flag)
|
if(flag)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < res.size(); i++)
|
for(int i = 0; i < res.size(); i++)
|
||||||
|
@ -16,6 +16,7 @@ namespace CppJieba
|
|||||||
bool init(const char* const dictFilePath);
|
bool init(const char* const dictFilePath);
|
||||||
bool destroy();
|
bool destroy();
|
||||||
public:
|
public:
|
||||||
|
bool cutMM(const string& chStr, vector<string>& res);
|
||||||
bool cutRMM(const string& chStr, vector<string>& res);
|
bool cutRMM(const string& chStr, vector<string>& res);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
29
Trie.cpp
29
Trie.cpp
@ -75,6 +75,7 @@ namespace CppJieba
|
|||||||
|
|
||||||
bool Trie::find(const ChUnicode* chUniStr, size_t len)
|
bool Trie::find(const ChUnicode* chUniStr, size_t len)
|
||||||
{
|
{
|
||||||
|
int res = -1;
|
||||||
TrieNode* p = _root;
|
TrieNode* p = _root;
|
||||||
for(size_t i = 0; i < len; i++)
|
for(size_t i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
@ -91,6 +92,7 @@ namespace CppJieba
|
|||||||
return p->isLeaf;
|
return p->isLeaf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
bool Trie::find(const vector<ChUnicode>& uniVec)
|
bool Trie::find(const vector<ChUnicode>& uniVec)
|
||||||
{
|
{
|
||||||
TrieNode * p = _root;
|
TrieNode * p = _root;
|
||||||
@ -108,6 +110,33 @@ namespace CppJieba
|
|||||||
}
|
}
|
||||||
return p->isLeaf;
|
return p->isLeaf;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
int Trie::findMaxMatch(const ChUnicode* chUniStr, size_t len)
|
||||||
|
{
|
||||||
|
int res = -1;
|
||||||
|
TrieNode * p = _root;
|
||||||
|
for(int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
ChUnicode chWord = chUniStr[i];
|
||||||
|
TrieNodeHashMap::const_iterator iter = p->hmap.find(chWord);
|
||||||
|
if(iter != p->hmap.end())
|
||||||
|
{
|
||||||
|
TrieNode * next = iter->second;
|
||||||
|
if(next->isLeaf)
|
||||||
|
{
|
||||||
|
res = i + 1;
|
||||||
|
}
|
||||||
|
p = next;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cout<<__FILE__<<__LINE__<<res<<endl;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
bool Trie::cut(const ChUnicode* chUniStr, size_t len, vector< vector<size_t> >& res)
|
bool Trie::cut(const ChUnicode* chUniStr, size_t len, vector< vector<size_t> >& res)
|
||||||
{
|
{
|
||||||
|
5
Trie.h
5
Trie.h
@ -95,8 +95,11 @@ namespace CppJieba
|
|||||||
bool init(const char* const filepath = DICT_FILE_PATH);
|
bool init(const char* const filepath = DICT_FILE_PATH);
|
||||||
bool destroy();
|
bool destroy();
|
||||||
void display();
|
void display();
|
||||||
|
|
||||||
|
public:
|
||||||
bool find(const ChUnicode* chUniStr, size_t len);
|
bool find(const ChUnicode* chUniStr, size_t len);
|
||||||
bool find(const vector<ChUnicode>& uniVec);
|
//bool find(const vector<ChUnicode>& uniVec);
|
||||||
|
int findMaxMatch(const ChUnicode* chUniStr, size_t len);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool cut(const ChUnicode* chUniStr, size_t len, vector< vector<size_t> >& res);
|
bool cut(const ChUnicode* chUniStr, size_t len, vector< vector<size_t> >& res);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user