目前,CKIP Client 開放原始碼專案已實作 Java、PHP 兩種版本,可以用來簡化 CKIP 斷詞服務用戶端應用程式的開發,而不需自行撰寫 Socket 程式碼及處理 XML 資料。而本文的 CKIP Client for .NET 則是自己重新以 C# 實作 CLR 非同步程式撰寫模型(Asynchronous Programming Model)所設計的斷詞服務用戶端 APIs。
使用範例
下列範例會使用 CkipClient 在同步封鎖模式進行連接、傳送文本,並接收傳回結果,其中 username 及 password 為用戶端所申請之帳號及密碼。
using (CkipClient client = new CkipClient("username", "password"))
{
client.Send("菩提本無樹,明鏡亦非臺;本來無一物,何處惹塵埃?");
SegmentationResult result = client.GetResult();
if (result.StatusCode == StatusCode.Success)
{
StringBuilder sb = new StringBuilder();
foreach (Term term in result.GetTerms())
{
sb.Append(term.ToString() + " ");
}
Console.WriteLine(sb.ToString());
}
else
{
Console.WriteLine(string.Format("Error: {0}", result.StatusDescription));
}
}
輸出結果如下:
菩提(N) 本無樹(N) ,(COMMACATEGORY) 明鏡(N) 亦(ADV) 非(Vt) 臺(N) ;(SEMICOLONCATEGORY) 本來(ADV) 無(Vt) 一(DET) 物(N) ,(COMMACATEGORY) 何處(N) 惹(Vt) 塵埃(N) ?(QUESTIONCATEGORY)
非同步 API 使用範例
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using CKIP;
namespace AsyncCkipClient
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void uxSend_Click(object sender, EventArgs e)
{
CkipClient client = new CkipClient();
client.BeginConnect(uxUsername.Text, uxPassword.Text,
new AsyncCallback(EndConnectCallback), client);
DisplayStatus("Connecting to server ...");
}
private void EndConnectCallback(IAsyncResult ar)
{
CkipClient client = (CkipClient)ar.AsyncState;
try
{
client.EndConnect(ar);
if (client.Connected)
{
client.BeginSend(uxRawText.Text,
new AsyncCallback(EndSendCallback), client);
DisplayStatus("Sending data to server ...");
}
else
{
DisplayStatus(string.Format("Ready (last error: {0})", "Connect Failed!"));
}
}
catch (Exception ex)
{
client.Close();
DisplayStatus(string.Format("Ready (last error: {0})", ex.Message));
}
}
private void EndSendCallback(IAsyncResult ar)
{
CkipClient client = (CkipClient)ar.AsyncState;
try
{
client.EndSend(ar);
client.BeginGetResult(new AsyncCallback(EndGetResultCallback), client);
DisplayStatus("Reading server response ...");
}
catch (Exception ex)
{
client.Close();
DisplayStatus(string.Format("Ready (last error: {0})", ex.Message));
}
}
private void EndGetResultCallback(IAsyncResult ar)
{
CkipClient client = (CkipClient)ar.AsyncState;
try
{
SegmentationResult result = client.EndGetResult(ar);
if (result.StatusCode == StatusCode.Success)
{
StringBuilder sb = new StringBuilder();
foreach (Term term in result.GetTerms())
{
sb.Append(term.ToString() + " ");
}
DisplayResults(sb.ToString());
}
else
{
DisplayStatus(string.Format("Ready (last error: {0})",
result.StatusDescription));
}
}
catch (Exception ex)
{
DisplayStatus(string.Format("Ready (last error: {0})", ex.Message));
}
finally
{
client.Close();
}
}
public void DisplayResults(string text)
{
if (InvokeRequired)
{
BeginInvoke(new Action<string>(DisplayResults), text);
return;
}
uxResult.Text = text;
DisplayStatus("Done");
}
public void DisplayStatus(string text)
{
if (InvokeRequired)
{
BeginInvoke(new Action<string>(DisplayStatus), text);
return;
}
uxStatus.Text = text;
}
}
}
參考資料:
實作 CLR 非同步程式撰寫模型 (Programming Model)
不錯的文,有極高的貢獻度。需要使用CKIP的人可以參考。
不過用"菩提本無樹,明鏡亦非臺;本來無一物,何處惹塵埃"當例子斷出來的結果就有點怪怪的ㄋㄟ...
Marc
2009年4月20日 中午12:09想請問一下高手,如果要寫成ASP.net,web service的asmx檔該如何去撰寫呢??才能取得此斷詞系統的服務呢?
bluecloud25
2009年6月11日 凌晨1:43To bluecloud25:
你可以在 Web 服務方法中,自行撰寫 Socket 程式或引用本文附件原始碼的 CKIP.dll 呼叫斷詞服務,然後傳回斷詞結果。以下是以 CkipClient 實作 Web 服務方法的範例:
[WebMethod]
public DataTable Send(string text) {
using (CkipClient client =
new CkipClient("username", "password"))
{
client.Send(text);
SegmentationResult result = client.GetResult();
IEnumerable<Term> query = result.GetTerms();
return query.ToDataTable<Term>("SegmentationResult");
}
}
其中,ToDataTable<T> 是自訂的擴充方法,你可以在這裡取得原始碼。
renjin
2009年6月11日 晚上9:57請問要如何申請帳號密碼呢?不好意思,因為課業上的需要,要用到斷詞系統,可否參考看看,謝謝
匿名
2010年2月22日 上午11:39請上官方網站:http://ckipsvr.iis.sinica.edu.tw/,進入[線上服務申請]選單,在線上提交申請資料即可。
renjin
2010年2月22日 中午12:36您好:謝謝你提供的範例~但有個問題要請教~
我的文章是從DB讀取出來後再用你的程式進行斷詞的,但~不知為何,每次都會出現Xml format error的狀況,我已經將會造成xml format error的特殊符號去除了但還是找不到原因,請幫幫我,謝謝
匿名
2010年4月5日 下午2:51可能是伺服端發生問題,才會導致解析回傳的XML資料時引發錯誤。通常,過了一段時間之後,系統就會恢復正常運作了。
renjin
2010年4月6日 上午9:47大大你好,如果想將此程式應用在ASP.NET的平台上,程式一樣是用C#撰寫,那要如何修改呢???
匿名
2011年8月9日 上午9:53如果要應用在ASP.NET的平台上,可實做 Web 服務方法間接叫用此元件(請參考如上回應的範例)。
renjin
2011年8月11日 上午11:31請較一下文字過多會有錯誤
jimmt
2012年1月10日 下午5:08請問有辦法大量的斷詞嗎 把整個資料夾的文章斷詞
mouse
2012年10月7日 下午4:26你必需撰寫額外的程式碼去逐一讀取資料夾中的文字檔,並將讀出的內容傳給 CKIP.dll 做斷詞。
renjin
2012年10月8日 下午1:16