全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1303
推到 Plurk!
推到 Facebook!

C語言~求救~請幫我看看這段程式!!

缺席
umiumi
一般會員


發表:1
回覆:0
積分:0
註冊:2006-08-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-24 13:33:16 IP:140.131.xxx.xxx 訂閱

我先說一下我的構想

假設已經有了一篇文章和詞庫(像字典一樣的詞庫)
想要用程式去"比對詞庫"做斷詞,請求高手協助!!謝謝
【範例文章】
陶大偉和兒子陶喆搶當莫文蔚台北小巨蛋演唱會嘉賓。
【假設詞庫】





台北

兒子

巨蛋








演唱
演唱會

嘉賓

【經過詞庫比對斷詞後得以下結果】




兒子







台北

巨蛋
演唱會
嘉賓.........以此類推(標點符號會去除)


1.詞庫裡的無記載明星名字,因此會判定為單字去斷詞)
2.詞庫裡有"兒"也有"兒子",但因為有"兒子"所以會考慮這個比較具有完整性的詞;像如果是"演"."演唱"."演唱會"
這種情況的話,程式在跑的時候會先去考慮一個字,再來去找兩個字的,再來去找三個字的可能性
(看詞庫有的詞而決定,如果詞庫裡面找不到"演唱會"三個字),斷詞就會變成「演唱」「會」
3.斷詞的判定方式是照順序的
ex:"舞台北方的那一棟大樓",會先對"舞台"斷詞,然後再來是"北方"....不會變成只有"舞"去斷詞,再來是"台北"斷詞!!!
EX:「舞台北方的那一棟大樓」斷詞後結果:
舞台
北方


一棟
大樓
---------------------------------------------
另外有些文章會發生斷詞後不合文章需要也沒關係!!只要照順序斷詞即可!!
EX:「久久一次上天堂玩玩也不錯」的結果變成:
久久
一次
上天

玩玩

不錯

===========================================================

目前程式碼只想到這邊,可以斷詞,但是卻是每一個字都斷.......

想請求高手協助!!謝謝囉

============================================================

#include
#include
#include

int main()
{
const int MAX_INPUT_SIZE = 10240; // for now, maximum of 10K of text
const int MAX_TOKEN_SIZE = 20;
const int MAX_TOKEN_COUNT = 5000;

char buf [ 10240 ] = { 0 };

char tokens [ MAX_TOKEN_COUNT ][ MAX_TOKEN_SIZE ];
char line [ MAX_TOKEN_SIZE ];
int tokenCnt = 0;
char* finger;
int i;

// read in tokens 讀取詞庫
FILE* file = fopen("4.txt", "rb");
while( !feof( file ) )

{
fgets( line, MAX_TOKEN_SIZE, file );
line[ strlen(line)-2 ] = 0;
if( strlen(line) )
strcpy( tokens[ tokenCnt], line );
}
fclose( file );

// read data into buf 讀取資料到快取記憶體
file = fopen("3.txt", "rb");
fread( buf, 1, MAX_INPUT_SIZE, file );
fclose( file );

file = fopen("output.txt", "wb");

// tokenize it
finger = buf;

// forward to Big5 1st char
while( *finger )
{
// take care of ANSI characters 處理中文字碼
if( (unsigned char)*finger <= 0x7F )
{
while( *finger && (unsigned char)*finger <= 0x7F )
fputc( *(finger ), file );
fputs("\r\n", file);
if( !*finger ) break;
}



if( i == tokenCnt ) {
fputc( *(finger ), file );
fputc( *(finger ), file );
}
// break token
fputs("\r\n",file);
}
system("pause");
return 0;
}

kenlee1109
初階會員


發表:20
回覆:40
積分:27
註冊:2006-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-24 22:06:34 IP:61.229.xxx.xxx 未訂閱
先將關鍵詞依字數的長短以降冪排序之就好了.不用複雜的程式啦!
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-25 02:39:35 IP:61.229.xxx.xxx 未訂閱

補充一下,不太明白你那「處理中文」的地方是在做什麼處理…? 也沒用到leadbyte…

建議做一個struck的陣列
struct QsToken
{
char mToken[MAX_TOKEN_LEN] = {0}; // store token here
unsigned char mTokenLen = 0; //store token size
};

QsToken gMyTokens[count];

有了這一維的結構體陣列就可以先拿它的mTokenLen值來做降冪排序(若一定要用純c語法,就要自己搞演算,比如quick sort…),排完後就從index=0開始比對,找到就記下來,並跳mTokenLen個長度,然後continue…

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-26 04:31:09 IP:61.229.xxx.xxx 未訂閱

再提供一個純C 的 qsort的範例 ( 我太閒了)
//---------------------------------------------------------------------------
#include
#include
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

typedef struct
{
char name[9];
int size;
} token;

token list[3]={{"大門鎖",3},{"大門",2},{"大門鎖上",4}};

typedef token *PTOKEN;

int sort_function( const void *a, const void *b);

int main(void)
{
int x;

qsort((void *)list, 3, sizeof(list[0]), sort_function);
for (x = 0; x < 3; x )
printf("%s\n", list[x].name);
system("pause");
return 0;
}

int sort_function( const void *a, const void *b)
{
int ans;
if(((PTOKEN)a)->size > ((PTOKEN)b)->size) ans=-1;
else if(((PTOKEN)a)->size < ((PTOKEN)b)->size) ans=1;
else
ans=0;
return ans;
}

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-05-13 3:44:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!