mirror of
https://github.com/yanyiwu/cppjieba.git
synced 2025-07-18 00:00:12 +08:00
feature: add RemoveWord api from https://github.com/yanyiwu/gojieba/pull/99
This commit is contained in:
parent
302a367338
commit
03cc7c39ff
@ -61,6 +61,15 @@ class DictTrie {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DeleteUserWord(const string& word, const string& tag = UNKNOWN_TAG) {
|
||||||
|
DictUnit node_info;
|
||||||
|
if (!MakeNodeInfo(node_info, word, user_word_default_weight_, tag)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
trie_->DeleteNode(node_info.word, &node_info);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
const DictUnit* Find(RuneStrArray::const_iterator begin, RuneStrArray::const_iterator end) const {
|
const DictUnit* Find(RuneStrArray::const_iterator begin, RuneStrArray::const_iterator end) const {
|
||||||
return trie_->Find(begin, end);
|
return trie_->Find(begin, end);
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,10 @@ class Jieba {
|
|||||||
return dict_trie_.InsertUserWord(word,freq, tag);
|
return dict_trie_.InsertUserWord(word,freq, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DeleteUserWord(const string& word, const string& tag = UNKNOWN_TAG) {
|
||||||
|
return dict_trie_.DeleteUserWord(word, tag);
|
||||||
|
}
|
||||||
|
|
||||||
bool Find(const string& word)
|
bool Find(const string& word)
|
||||||
{
|
{
|
||||||
return dict_trie_.Find(word);
|
return dict_trie_.Find(word);
|
||||||
|
@ -141,7 +141,33 @@ class Trie {
|
|||||||
assert(ptNode != NULL);
|
assert(ptNode != NULL);
|
||||||
ptNode->ptValue = ptValue;
|
ptNode->ptValue = ptValue;
|
||||||
}
|
}
|
||||||
|
void DeleteNode(const Unicode& key, const DictUnit* ptValue) {
|
||||||
|
if (key.begin() == key.end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//定义一个NextMap迭代器
|
||||||
|
TrieNode::NextMap::const_iterator kmIter;
|
||||||
|
//定义一个指向root的TrieNode指针
|
||||||
|
TrieNode *ptNode = root_;
|
||||||
|
for (Unicode::const_iterator citer = key.begin(); citer != key.end(); ++citer) {
|
||||||
|
//链表不存在元素
|
||||||
|
if (NULL == ptNode->next) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
kmIter = ptNode->next->find(*citer);
|
||||||
|
//如果map中不存在,跳出循环
|
||||||
|
if (ptNode->next->end() == kmIter) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//从unordered_map中擦除该项
|
||||||
|
ptNode->next->erase(*citer);
|
||||||
|
//删除该node
|
||||||
|
ptNode = kmIter->second;
|
||||||
|
delete ptNode;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
void CreateTrie(const vector<Unicode>& keys, const vector<const DictUnit*>& valuePointers) {
|
void CreateTrie(const vector<Unicode>& keys, const vector<const DictUnit*>& valuePointers) {
|
||||||
if (valuePointers.empty() || keys.empty()) {
|
if (valuePointers.empty() || keys.empty()) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user