?? splitword.c
字號:
while ( i > 1 )
{
for ( j = MAX_CWORD_LEN ; j >= 2 ; j -=2 )
{ //最長xxx個漢字
if ( i < j )
continue;
l = 0 ;
for ( k = i - j ,l = 0 ; k < i ; k ++,l ++ )
strChar[l] = strText[k];
strChar[l] = '\0';
if ( 8 == j )
{//4個字時,無論哪種情況下都要比較前兩個及后兩個,防止"后三字是一個詞,但第一個字跟再前一個字是一個詞",同時可以捕獲成詞由兩個詞組成的
//如,讓“我看看怒火鳳凰",應該是"怒火"+鳳凰,而不是"怒"+"火鳳凰"
strChar1[0] = strChar[0];strChar1[1] = strChar[1];
strChar1[2] = strChar[2];strChar1[3] = strChar[3];
strChar1[4] = '\0';
strChar2[0] = strChar[4];strChar2[1] = strChar[5];
strChar2[2] = strChar[6];strChar2[3] = strChar[7];
strChar2[4] = '\0';
bFound = searchWord(strChar1 , 4 ); //先取前兩個字比較
if ( TRUE == bFound )
{
bFound = searchWord(strChar2 , 4 ); //再取后兩個字比較
if ( TRUE == bFound )
{ //后兩個是詞
addSegWord(strChar1,4); //則,前后兩個字,當做兩個詞加入
addSegWord(strChar2,4);
i -= j ;
break;
}
}
else
{ //再比較前三字是否一個詞
strChar3[0] = strChar[0];strChar3[1] = strChar[1];
strChar3[2] = strChar[2];strChar3[3] = strChar[3];
strChar3[4] = strChar[4];strChar3[5] = strChar[5];
strChar3[6] = '\0';
bFound = searchWord(strChar3,6);
if ( TRUE == bFound )
{ //是三個字的,前三個加入,后一個單字加入
addSegWord(strChar3,6);
strChar2[0] = strChar[6];strChar2[1] = strChar[7];
strChar2[2] = '\0';
addSegWord(strChar2,2);
i -= j ;
break;
}// 前三字不是詞
}
}
else if ( 6 == j )
{ /*判斷3個漢字,兩種情況: 1+2 和 2+1,1+2止面8==j的地方已經捕獲岐義,1+2好像不會有岐義
1+2 情況不要拆開
但以下地名如何處理:北京市房產公司,按理“北京”和“北京市“應該找到相同的,就是說,要能智能識別成"北京”和“北京市”是一樣的*/
}
else if ( 2 == j )
{ //單個漢字
addSegWord(strChar,2);
i -= 2 ;
break;
}
bFound = searchWord(strChar , l );//in_array($strChar , $arrayChineseDict );//匹配詞典
if ( TRUE == bFound )
{
i -= j;
addSegWord(strChar,l);
break;
}
else
{
//1.是否全是外來詞
//2.是否全是數字
//3.如果第一二字是”姓氏“,則默認為姓名
//4.判斷其它名字
}
} // end for j
} // end while $i > 0
return 0;
}
int initSegList()
{
int i , j ;
for ( i = 0 ; i < MAX_CDIM ; i ++ )
{
for ( j = 0 ; j < MAX_CDIM ; j ++ )
{
SEG_LIST[i][j].lstWord = (SEG_NODE *)NULL;
}
}
return TRUE;
}
int loadDict(char *strFilename)
{
int len = 0 , i ,j ;
FILE *fpDict = NULL;
unsigned char firstChar,lastChar;
// firstChar="a" ;
// lastChar='\0';
char sLine[128];
for ( i = 0 ; i < MAX_CDIM ; i ++ )
{
for ( j = 0 ; j < MAX_CDIM ; j ++ )
{
CH_DICT[i][j].lstWord = (WORD_NODE *)NULL;
}
}
fpDict = fopen(strFilename,"r");
if ( fpDict == ( FILE *)NULL )
{
printf("open dict file %s error !\n",strFilename);
return -1;
}
while ( !feof(fpDict))
{
fgets(sLine,128,fpDict);
strTrim(sLine);
len = strlen(sLine);
if ( len < 1 || len > MAX_CWORD_LEN )
printf("%s error!\n",sLine);
addDictWord(sLine,len);
}
fclose(fpDict);
return 0;
}
BOOL isEnglishStop(unsigned char *strWord)
{
//,arrayEnglishStop
return FALSE ;
}
/*inline*/ BOOL isAsciiSymbol(char cChar)
{
int i = 0 ;
for ( i = 0 ; i < sizeof(arrayAsciiSymbol) ; i ++ )
if ( cChar == arrayAsciiSymbol[i])
return TRUE;
return FALSE;
}
int segSentence (char *strText ,BOOL bSpace )
{
int iTextLen = strlen(strText) ;
int iWordLen= 0 ;
int i = 0 ;
int iNexti = 0 ;
BOOL bSep = FALSE ;//否是分隔符或者是一個詞結束
BOOL bChinese = FALSE ;//上一個有效字符類型,
//false:英文 true: Chinese
BOOL bFound = FALSE ;
unsigned char strWord[MAX_SWORD_LEN + 1]; //當前詞
unsigned char strChar[3]; //
unsigned char cChar; //
memset(strWord,0,sizeof(strWord));
strChar[0] = '\0';
for ( i = 0 ; i < iTextLen ; i ++ )
{
cChar = (unsigned char )strText[i];
if (128 > cChar) { //英文字符
/****如果連續空格不算分隔的話,用下面這一段代碼 ****/
if ( ' ' == cChar || '\t' == cChar || '\r' == cChar || '\n' == cChar )
{
if ( TRUE == bChinese )
{ //如果前面一個有效字符是Chinese
if ( TRUE == bSpace && (' ' == cChar || '\t' == cChar))
bSep = TRUE ;
else continue ; //繼續取下一個字符,因為漢字的詞可以換行或用空格隔開
}
else
{
bSep = TRUE ;
}
}
else
{
bSep = isAsciiSymbol(cChar); //判斷是否是分隔符
}
if ( (TRUE == bSep || TRUE == bChinese ) && 0 < iWordLen )
{ //一個單詞結束
if ( iWordLen > MAX_SWORD_LEN )
iWordLen = MAX_SWORD_LEN;
strWord[iWordLen] = '\0';
segWord(strWord,iWordLen,bChinese);
iWordLen = 0 ;
}
if ( FALSE == bSep )
{
strWord[iWordLen] = cChar;
//同一個單詞的字母,并在一起
iWordLen ++ ;
}
bChinese = FALSE ;
}
else
{ //字符Chinese
if ( FALSE == bChinese && FALSE == bSep && 0 < iWordLen )
{//以前是英文,碰到漢字,就當英文單詞結束
if ( iWordLen > MAX_SWORD_LEN )
iWordLen = MAX_SWORD_LEN;
strWord[iWordLen] = '\0';
bFound = isEnglishStop(strWord);
if ( FALSE == bFound )
{
segWord(strWord,iWordLen,bChinese);
} // end if
iWordLen = 0 ;
}
iNexti = i + 1 ;
if ( iNexti < iTextLen )
{
if ( 128 > ((unsigned char)strText[iNexti]) )
{ //單字符>=128,不處理該字符
continue ;
}
}
else
{ //最后一個字符是大于128的單字符
break;
}
strChar[0] = strText[i];
strChar[1] = strText[i+1];
strChar[2] = '\0';
//是否有可能>128的字符,只有一個字符,如果有需要另外判斷,現在默認一定會有至少兩個字符同時出現
bChinese = TRUE ; //是漢字Chinese
i ++ ; //只需要加1
if (strChar[0] == 0xa1 && strChar[1] == 0xa1 )
{ //Chinese空格,16進制:A1,A1
if ( TRUE == bSpace )
bSep = TRUE ;
else continue ; //連續Chinese空格
}
else if ( strChar[0] < 176 )
{//中文標點等非漢字字符
bSep = TRUE ;
}
else bSep = FALSE;
if ( TRUE == bSep && 0 < iWordLen )
{
if ( iWordLen > MAX_SWORD_LEN )
iWordLen = MAX_SWORD_LEN;
strWord[iWordLen] = '\0';
segWord(strWord,iWordLen,bChinese);
iWordLen = 0 ;
}
if ( FALSE == bSep )
{
strWord[iWordLen++] = strChar[0];
strWord[iWordLen++] = strChar[1];
}
} // end if ord
} // end for $i
if ( 0 < iWordLen )
{ //還有未處理的單詞
if ( iWordLen > MAX_SWORD_LEN )
iWordLen = MAX_SWORD_LEN;
strWord[iWordLen] = '\0';
segWord(strWord,iWordLen,bChinese);
iWordLen = 0 ;
}
return 0;
}
int main(int argc,char *argv[])
{
char strText[] = "遺傳算法(Genetic Algorithm)是一類借鑒生物界的進化規律(適者生存,優勝劣汰遺傳機制)演化而來的隨機化搜索方法。遺傳算法是模擬達爾文的遺傳選擇和自然淘汰的生物進化過程的計算模型。它的思想源于生物遺傳學和適者生存的自然規律,是具有“生存+檢測”的迭代過程的搜索算法。遺傳算法以一種群體中的所有個體為對象,并利用隨機化技術指導對一個被編碼的參數空間進行高效搜索。其中,選擇、交叉和變異構成了遺傳算法的遺傳操作;參數編碼、初始群體的設定、適應度函數的設計、遺傳操作設計、控制參數設定五個要素組成了遺傳算法的核心內容。 作為一種新的全局優化搜索算法,遺傳算法以其簡單通用、魯棒性強、適于并行處理以及高效、實用等顯著特點,在各個領域得到了廣泛應用,取得了良好效果,并逐漸成為重要的智能算法之一。";
loadDict("sqlet.dict");
initSegList();
printf("開始分詞\n");
segSentence(strText ,TRUE ) ;
freeSeg();
printf("結束分詞\n");
freeDict();
return 0 ;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -