以前用C 實現的RMM分詞型別

2021-08-20 13:42:18 字數 2819 閱讀 9544

中文分詞中用到的rmm(

逆向最大匹配演算法)演算法。不說那麼多了,我不是研究演算法的,總之rmm這種基於詞典的分詞演算法,準確率比較高就是了。我實現的這個方法,會把非詞典的內容,全部拆分成單字。寫了很多年了,忘記了很多,直接貼**:

#include

#include

#include

#include

#include

#include "tools.h"

using namespace std;

#ifndef parth

#define parth

#define _array_count_(x) sizeof(x)/sizeof(*x)

#define _wprintf_(c) setlocale(lc_all,"chs"); wprintf( c ); cout << endl;

#define _wvector_ vector

void createvectorforarray(const wstring *arr, const int arr_len, vector&vec);

void strreplace(wstring &str, const wstring find, const wstring replace);

#define _wcreatevectorforarray_(src,target) createvectorforarray(src,_array_count_(src),target);

#define _winvectory(str, vec) winvectory(str,vec)

void createvectorforarray(const wstring *arr, const int arr_len, vector&vec)

void strreplace(wstring &str, const wstring find, const wstring replace) }

typedef struct wordpartresultitem;

} _wordpartresultitem;

typedef wordpartresultitem _wordpartresult;

class wordpart;

#endif;

wordpart::wordpart( wstring word, int word_len);

wstring end_tmp = ;

_wcreatevectorforarray_(trim_tmp,trim_str)

_wcreatevectorforarray_(end_tmp,end_dot)

//整理詞典

for( int i=0; iint k = word[i].size();

if( words.find(k) == words.end() )

words[k].push_back(word[i]); }

}void wordpart::setcontent( wstring content)

this->content = content; }

int wordpart::getmaxlength(wstring *words)

return size; }

mapwordpart::part()

if( words.find(1) == words.end() 

|| find( words[1].begin(), words[1].end(), cstr ) == words[1].end() )

setresult(result,sort,cstr,i);

}else }

if(!eng.empty()) }

_wvector_ line;

wstring one_line = l"";

//段句

for( int i=0; iwstring str = content.substr( i, 1 );

if( find(end_dot.begin(),end_dot.end(),str) == end_dot.end() )else

if( i==content.size() - 1 && !one_line.empty() ) }

int content_size = content.size(), offset = content_size, sort = 0;

for(_wvector_::iterator i=line.begin(); i != line.end(); i++)

//分詞

wstring str = *i;

//段內容

wstring cstr;

//分段內容

int begin = 0,pointer;

//游標,乙個全域性游標,和乙個相對游標

int k;

//詞典鍵

int sublength = max_length;

//每個查詢字元的長度

if( str.size() > max_length )else

while (begin != -sublength)

} pointer++;

if( pointer < sublength )

begin++; }

begin-=sublength; }

}return result; }

void wordpart::setresult( map&result, int &sort, const wstring k, const int offset )

result[k].count += 1;

result[k].endoffset = offset; }

3 2 2 用 C 實現元組型別

3.2.2 用 c 實現元組型別 system 命名空間中實際的 tuple型別更複雜一點,但是,我們可以很容易實現在這一章中所需要的功能。我們對其命名與 net 型別相同,因此,如果不使用 net 4.0,在所有的示例中可以使用我們 這裡 所實現的 元組 清單 3.7 是完整的 清單 3.7 實現...

用C 實現基於用C 實現基於TCP協議的網路通訊

tcp 協議是乙個基本的網路 協議,基本上所有的網路服務都是基於 tcp協議的,如http,ftp等等,所以要了解網路程式設計就必須了解基於 tcp協議的程式設計。然而 tcp協議是乙個龐雜的體系,要徹底的弄清楚它的實現不是一天兩天的功夫,所幸的是在.net framework環境下,我們不必要去追...

用c 實現複數的加減乘除 用C實現複數

用c 實現複數的加減乘除 在本文中,我將向您展示一種使用c程式語言實現複數的方法。請注意,使用此處提供的 沒有任何保證。複數是乙個數字,例如z,表示z realpart i imaginarypart,其中i是虛數單位,有時用j表示。另外,i i 1,這在找到兩個複數的乘積 除法時很重要。自然,我們...