[C#] 盤古分詞,尋找句子中的分詞+詞性

2017-04-10

很久很久以前寫過一篇文章 [C#] 盤古分詞,尋找句子中的分詞 ,今天這邊用新版的盤古,然後加上分詞的屬性,首先透過nuget 下載一個 PanGu.Segment 來輔助,因為這包裝的還不錯
Image 220

nuget 網址 : https://www.nuget.org/packages/PanGu.Segment/

因為這很方便他連字典檔都下來了,這時候,你需要做一個小動作,將專案下的Dict檔案夾讓他編譯時候含進去
Image 216

輸出時改一律複製,這樣執行起來就不會出錯接下來是 C# sample code :

            ltlResult.Text = "";
            var segment = new PanGu.Segment();
            var words = segment.DoSegment(txtContent.Text);
            foreach (var word in words)
            {
                ltlResult.Text += (word + "," + word.Pos + "<br />");

            }

結果 :
Image 221

後面那就是詞性,跟我之前文章敘述到的那個編輯器有對應,但是那些詞性是啥鬼阿,我找了一下,終於在這裡: http://blog.sina.com.cn/s/blog_42bea1a801019jeh.html ,有找到其他大大的整理,感謝大大的無私貢獻。

private string GetChsPos(POS pos)
        {
         
            switch (pos)
            {
                case POS.POS_UNK:
                    return "未知詞性";
                case POS.POS_D_K:
                    return "後接成分";
                case POS.POS_D_H:
                    return "前接成分";
                case POS.POS_A_NZ:
                    return "其他專名";
                case POS.POS_A_NX:
                    return "外文字符";
                case POS.POS_A_NR:
                    return "人名";
                case POS.POS_D_Z:
                    return "狀態詞";
                case POS.POS_A_NT:
                    return "機構團體";
                case POS.POS_A_NS:
                    return "地名";
                case POS.POS_D_Y:
                    return "語氣詞 語氣語素";
                case POS.POS_D_X:
                    return "非語素字";
                case POS.POS_D_W:
                    return "標點符號";
                case POS.POS_D_T:
                    return "時間詞";
                case POS.POS_D_S:
                    return "處所詞";
                case POS.POS_D_V:
                    return "動詞 動語素";
                case POS.POS_D_U:
                    return "助詞 助語素";
                case POS.POS_D_R:
                    return "代詞 代語素";
                case POS.POS_A_Q:
                    return "量詞 量語素";
                case POS.POS_D_P:
                    return "介詞";
                case POS.POS_D_MQ:
                    return "數量詞";
                case POS.POS_A_M:
                    return "數詞 數語素";
                case POS.POS_D_O:
                    return "擬聲詞";
                case POS.POS_D_N:
                    return "名詞 名語素";
                case POS.POS_D_F:
                    return "方位詞 方位語素";
                case POS.POS_D_E:
                    return "嘆詞 嘆語素";
                case POS.POS_D_L:
                    return "習語";
                case POS.POS_D_I:
                    return "成語";
                case POS.POS_D_D:
                    return "副詞 副語素";
                case POS.POS_D_C:
                    return "連詞 連語素";
                case POS.POS_D_B:
                    return "區別詞 區別語素";
                case POS.POS_D_A:
                    return "形容詞 形語素";
            }
            return "未知詞性";
        }

之後code 修改成 :

            var segment = new PanGu.Segment();
            var words = segment.DoSegment(txtContent.Text);
            foreach (var word in words)
            {
               ltlResult.Text+=(word + "," + GetChsPos(word.Pos) + "<br />");
            }

結果:
image

這樣是不是一切好多了,遇到坑分享一下給大家。

程式碼: https://github.com/donma/PenguSegmentPartOfSpeech


當麻許的超技八 2014 | Donma Hsu Design.