CKIP Client for .NET

CKIP 中文斷詞系統是由中文詞知識庫小組(Chinese Knowledge Information Processing Group,CKIP)所發展的線上斷詞服務。此服務採用 XML 資料交換模式,用戶端必須自行撰寫程式經由 TCP Scoket 傳送文本到斷詞系統,並剖析回傳包含斷詞及詞類標記的 XML 處理結果。

目前,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;
}
}
}



Download source code

參考資料:
實作 CLR 非同步程式撰寫模型 (Programming Model)


Share/Save/Bookmark

12 comments :: CKIP Client for .NET

  1. 不錯的文,有極高的貢獻度。需要使用CKIP的人可以參考。
    不過用"菩提本無樹,明鏡亦非臺;本來無一物,何處惹塵埃"當例子斷出來的結果就有點怪怪的ㄋㄟ...

  2. 想請問一下高手,如果要寫成ASP.net,web service的asmx檔該如何去撰寫呢??才能取得此斷詞系統的服務呢?

  3. To 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> 是自訂的擴充方法,你可以在這裡取得原始碼。

  4. 請問要如何申請帳號密碼呢?不好意思,因為課業上的需要,要用到斷詞系統,可否參考看看,謝謝

  5. 請上官方網站:http://ckipsvr.iis.sinica.edu.tw/,進入[線上服務申請]選單,在線上提交申請資料即可。

  6. 您好:謝謝你提供的範例~但有個問題要請教~
    我的文章是從DB讀取出來後再用你的程式進行斷詞的,但~不知為何,每次都會出現Xml format error的狀況,我已經將會造成xml format error的特殊符號去除了但還是找不到原因,請幫幫我,謝謝

  7. 可能是伺服端發生問題,才會導致解析回傳的XML資料時引發錯誤。通常,過了一段時間之後,系統就會恢復正常運作了。

  8. 大大你好,如果想將此程式應用在ASP.NET的平台上,程式一樣是用C#撰寫,那要如何修改呢???

  9. 如果要應用在ASP.NET的平台上,可實做 Web 服務方法間接叫用此元件(請參考如上回應的範例)。

  10. 請較一下文字過多會有錯誤

  11. 請問有辦法大量的斷詞嗎 把整個資料夾的文章斷詞

  12. 你必需撰寫額外的程式碼去逐一讀取資料夾中的文字檔,並將讀出的內容傳給 CKIP.dll 做斷詞。

張貼留言