1. 程式人生 > >NLPIR ICTCLAS2013在.net環境下的除錯

NLPIR ICTCLAS2013在.net環境下的除錯

NLPIR漢語分詞系統(又名ICTCLAS2013),主要功能包括中文分詞;詞性標註;命名實體識別;使用者詞典功能;支援GBK編碼、UTF8編碼、BIG5編碼。新增微博分詞、新詞發現與關鍵詞提取;張華平博士先後傾力打造十餘年,核心升級10次。詳見http://ictclas.nlpir.org/
下載了dll檔案進行除錯,發現了好多問題,拿出來分享一下
按照官方的開發文件http://ictclas.nlpir.org/newsDetail?DocId=368寫了一個類
執行的時候提示無法找到函式入口,去網上搜了一下,用這樣的辦法解決了
下載一個exescope工具,開啟NLPIR.dll,在匯出裡面可以看到NLPIR的各種函式,發現好多亂碼,如下圖


於是我把這些亂碼都複製過去,居然可以用了,但是提示原因可能是託管的 PInvoke 簽名與非託管的目標籤名不匹配。在dllimport裡面新增這樣一個屬性就可以了CallingConvention = CallingConvention.Cdecl。CallingConvention指定呼叫在非託管程式碼中實現的方法所需的呼叫約定,其中cdecl呼叫方清理堆疊。這使您能夠呼叫具有varargs 的函式(如 Printf),使之可用於接受可變數目的引數的方法。今年的微軟2013暑期實習筆試題第一題考的就是這個,我雖然不知道這個具體是什麼意思,但是知道cdecl支援可變數目的引數的方法,這道題就答對了。。。

最後分詞的類是這樣的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace FenciTest
{
    [StructLayout(LayoutKind.Explicit)]
    public struct result_t
    {
        [FieldOffset(0)]
        public int start;
        [FieldOffset(4)]
        public int length;
        [FieldOffset(8)]
        public int sPos1;
        [FieldOffset(12)]
        public int sPos2;
        [FieldOffset(16)]
        public int sPos3;
        [FieldOffset(20)]
        public int sPos4;
        [FieldOffset(24)]
        public int sPos5;
        [FieldOffset(28)]
        public int sPos6;
        [FieldOffset(32)]
        public int sPos7;
        [FieldOffset(36)]
        public int sPos8;
        [FieldOffset(40)]
        public int sPos9;
        [FieldOffset(44)]
        public int sPos10;
        //[FieldOffset(12)] public int sPosLow;
        [FieldOffset(48)]
        public int POS_id;
        [FieldOffset(52)]
        public int word_ID;
        [FieldOffset(56)]
        public int word_type;
        [FieldOffset(60)]
        public double weight;
    }

    public class Fenci2013
    {
        const string path = @"NLPIR.dll";//設定dll的路徑
        //對函式進行申明
        [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "
[email protected]
@[email protected]", CallingConvention = CallingConvention.Cdecl)] public static extern bool NLPIR_Init(String sInitDirPath, int encoding); //特別注意,C語言的函式NLPIR_API const char * NLPIR_ParagraphProcess(const char *sParagraph,int bPOStagged=1);必須對應下面的申明 [DllImport(path, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl, EntryPoint = "[email protected]@[email protected]")] public static extern IntPtr NLPIR_ParagraphProcess(String sParagraph, int bPOStagged = 1); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@YA_NXZ")] public static extern bool NLPIR_Exit(); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@[email protected]")] public static extern int NLPIR_ImportUserDict(String sFilename); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@[email protected]")] public static extern bool NLPIR_FileProcess(String sSrcFilename, String sDestFilename, int bPOStagged = 1); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@@[email protected]")] public static extern bool NLPIR_FileProcessEx(String sSrcFilename, String sDestFilename); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@[email protected]", CallingConvention = CallingConvention.Cdecl)] public static extern int NLPIR_GetParagraphProcessAWordCount(String sParagraph); //NLPIR_GetParagraphProcessAWordCount [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@[email protected]@@Z",CallingConvention = CallingConvention.Cdecl)] public static extern void NLPIR_ParagraphProcessAW(int nCount, [Out, MarshalAs(UnmanagedType.LPArray)] result_t[] result); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@[email protected]", CallingConvention = CallingConvention.Cdecl)] public static extern int NLPIR_AddUserWord(String sWord); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@YAHXZ")] public static extern int NLPIR_SaveTheUsrDic(); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@[email protected]",CallingConvention = CallingConvention.Cdecl)] public static extern int NLPIR_DelUsrWord(String sWord); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@YA_NXZ")] static extern bool NLPIR_NWI_Start(); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@YA_NXZ")] static extern bool NLPIR_NWI_Complete(); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@[email protected]")] static extern bool NLPIR_NWI_AddFile(String sText); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@[email protected]")] static extern bool NLPIR_NWI_AddMem(String sText); [DllImport(path, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi, EntryPoint = "[email protected]@[email protected]")] public static extern IntPtr NLPIR_NWI_GetResult(bool bWeightOut = false); [DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "[email protected]@YAIXZ")] static extern uint NLPIR_NWI_Result2UserDict(); } }
在程式中分詞的程式碼如下:
 int count = Fenci2013.NLPIR_GetParagraphProcessAWordCount(s);//Fenci先得到結果的詞數
    result_t[] t=new result_t[count];
    Fenci2013.NLPIR_ParagraphProcessAW(count, t);
    System.Console.WriteLine("NLPIR_GetParagraphProcessAWordCount success!");

    result_t[] result = new result_t[count];//在客戶端申請資源
            
    Fenci2013.NLPIR_ParagraphProcessAW(count, result);//獲取結果存到客戶的記憶體中
    foreach (result_t r in result)
    {
        Console.WriteLine(s.Substring(r.start, r.length));
    }

示例程式碼http://download.csdn.net/detail/ztdgmail/5229707

相關推薦

NLPIR ICTCLAS2013在.net環境除錯

NLPIR漢語分詞系統(又名ICTCLAS2013),主要功能包括中文分詞;詞性標註;命名實體識別;使用者詞典功能;支援GBK編碼、UTF8編碼、BIG5編碼。新增微博分詞、新詞發現與關鍵詞提取;張華平博士先後傾力打造十餘年,核心升級10次。詳見http://ictclas

.NET環境Configuration 與ConfigurationManager/ AppSettings 與 ConfigSections探討

判斷 過程 屬性 定義 註意 ash tps dict gre 關於配置文件的設置,讀取有不少細節需要註意的。A 一般情況下,配置文檔會默認使用其下的AppSettings屬性中的值。 以下為普通的VB代碼實現方式: Dim exeFileMap As E

.net環境跨進程、高頻率讀寫數據

rom ppi MF page 系統架構 return log 針對 gid 一、需求背景 1、最近項目要求高頻次地讀寫數據,數據量也不是很大,多表總共加起來在百萬條上下。 單表最大的也在25萬左右,歷史數據表因為不涉及所以不用考慮, 難點在於這個規模的熱點數據,變化

VS環境除錯ABAQUS子程式的處理辦法

設定除錯環境 for中新增暫停程式碼 logical :: firstrun = .true. integer tempvar if(firstrun) then write(*,*)"please input an integer:" read(*,*)te

linux環境除錯程式碼

//建立檔案test.c [[email protected] code]$ touch test.c [[email protected] code]$ ls test.c //編輯test.c [[email protected

C#.net 環境使用OpenCV(一)

首先介紹一下EmguCV 。 EmguCV a是.NET 平臺下對OpenCV 影象處理庫的封裝。也就是OpenCV的.NET 版。它執行在.NET 相容的程式語言下呼叫OpenCV 的函式,如C#、VB、VC++、IronPython 等。這個封裝庫可以在Mono 下

NET環境的未處理異常(unhandled exception)的解決方案

NET環境下的未處理異常(unhandled exception )的解決方案      .Net 框架提供了非常強大的異常處理機制,同時對一些非託管程式碼很難控制的系統問題比如指標越界,記憶體洩漏等提供了很好的解決方案。相比非託管程式碼構建的系 統,.Net構建的系統

pycharm配置遠端環境除錯

下面以配置centos7遠端除錯為例進行說明。1.開啟pycharm。2.開啟Tools->Deployment->configration..3.點選“+”新增一個新的Deployment配置。6.在connection的tab設定基本資訊7.通過高階選項配置檔

.net程式在無.net環境執行

看了篇文章  測試了下竟然真的可以執行  測試環境是XP下  沒有裝NET2.0的情況下 可以執行的   不過需要每次輸入命令才能執行 點選後還是會報錯 原文如下 眾所周知,.net程式必須執行在.net framework環境下,這在很大程度上限制了.net程式的

QEMU+GDB環境除錯NOVA微核心

       為了更好的學習與瞭解一個OS微核心,瞭解微核心的程式碼如何執行十分必要,因此學會如何除錯觀察微核心的程式便是更好的學習與瞭解一個核心程式碼的開始。我學習的是Fiasco微核心系列中的基於x86體系的多核輕量級微核心NOVA,我們知道核心程式不能直接放在一般的ID

Nginx在ASP.Net環境的配置

ASP.Net可以部署在Windows的IIS伺服器上,也可以通過Mono工具部署在Windows,Linux,Mac OS作業系統上。1.Mono步驟1:下載Nginx的Windows版本和Mono步

Java與.Net環境RSA加密解密互動不成功的問題解決【續】

在前面《一篇文章》中提到了 Java和.Net環境下RSA加解密不能互通的情況,最後通過重寫.Net下面RSA演算法來解決了問題;本文將就這個問題再深入一點,看是否能有其他方式可以解決; 首先來看下Java對Security領域的支援情況Jdk提供了非常強大的API集合,以及

在asp.net環境使用Protocol Buffer

什麼是Protocol Buffer就不介紹了,網上資料很多,簡單說一下在asp.net環境下的使用。 要想在.net環境下使用,可以選擇Protobuf的.net版本,即Protobuf-net。首先下載Protobuf-net,我使用的是Protobuf-

vs2010環境除錯程式出現0xc000007b問題

先說下自己的情況:          用MKL時一直出現 0xc000007b  搜了很多,下面這篇幫助最大。        問題是在Linker->Input裡面:先是用的libguide40.lib,這時出現錯誤。改成libguide.lib後正常運行了!    

在.Net環境使用elasticsearch實現大數據量的搜索

hresult 多功能 .com download 默認 uid 端口 過程 connect 最近因為項目需要使用搜索引擎,因此嘗試使用.Net去操作elasticsearch,把使用過程記錄如下: 1.安裝elasticsearch 2.安裝elasticsearch插件

Centos7環境使用Nginx托管.Net Core應用程序

erro else hid dev 直接 update 谷歌瀏覽器 rod ins 一、安裝.Net Core 參考官方文檔:https://www.microsoft.com/net/core#linuxcentos 1、添加dotnet產品Feed 在安裝.NET C

Centos環境搭建Asp.NET Core環境和安裝Jexus

logs date mic razor www 啟動 iss jsb run ?? .NET Core2.0出來以後,很多公司開始用於實踐生產,其中的原因想必大家都明白,最主要的一下幾點。 跨平臺,能夠部署在Linux和Docker容器中 性能優越,測試時Node的20倍

在Linux環境使用Apache部署ASP.NET Core

tgt tab dot sce aaa target 部署 AI startup 在前幾篇文章中我們一起探討了如何在Linux環境中安裝ASP.NET Core運行時環境及將ASP.NET Core項目部署在Jexus中,這篇文章中我們將探討如何將ASP.NET Core部

.Net Core 環境構建強大且易用的規則引擎

right 使用 param 分享 img blog HR ins 重新 本文源碼: https://github.com/jonechenug/ZHS.Nrules.Sample 1. 引言 1.1 為什麽需要規則引擎 在業務的早期時代,也許使用硬編碼或者邏輯判斷就可

ASP.NET環境配置檔案web.config的靈活配置---轉

轉自:https://www.cnblogs.com/hugogoos/p/6426887.html 除錯,釋出Asp.net程式的時候,開發環境和釋出環境的Web.Config往往不同,比如connectionstring等。如果常常有除錯,釋出的需求,就需要常常修改web.config檔案,這往往是一件