Python は crf インターフェイス + 情報抽出を呼び出します

続きhttps://blog.csdn.net/m0_49621298/article/details/109896619

1. crf++のPythonインターフェースのインストール

CRF++-0.58\python パスの下にコマンド ラインを入力し、次のコマンドを実行します。

python setup.py build
python setup.py install

2. インターフェース呼び出し

エラー: ImportError: DLL のロードに失敗しました: %1 は有効な Win32 アプリケーションではありません。

import CRFPP
  File "D:\Anaconda3\lib\site-packages\CRFPP.py", line 26, in <module>
    _CRFPP = swig_import_helper()
  File "D:\Anaconda3\lib\site-packages\CRFPP.py", line 22, in swig_import_helper
    _mod = imp.load_module('_CRFPP', fp, pathname, description)
  File "D:\Anaconda3\lib\imp.py", line 243, in load_module
    return load_dynamic(name, filename, file)
  File "D:\Anaconda3\lib\imp.py", line 343, in load_dynamic
    return _load(spec)
ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。

ネットで調べても解決策はなく、libcrfpp.dllというファイルを思いつき、それをコピーして\Anaconda3\Lib\site-packagesの下に置いたところ、エラーは報告されませんでした。

3. モデル呼び出しと情報抽出

今回は単語分割と品詞タグ付けにpyhanlpを使用します 詳細は前回の記事https://blog.csdn.net/m0_49621298/article/details/109896619を参照してくださいコードと結果は以下の通りです

def singlesentence(sentence,modelname):#单句执行
    print("句子:",sentence)
    CustomDictionary.add("%", "q 0")  # 自定义词性
    CustomDictionary.add("%", "q 0")  # 自定义词性
    sentence_seged = HanLP.segment(sentence)  # 分词、词性
    tagger = CRFPP.Tagger("-m"+modelname)
    tagger.clear()
    for x in sentence_seged:
        tagger.add(str(x.word)+ "\t"+str(x.nature))
    tagger.parse()
    size = tagger.size()
    xsize = tagger.xsize()
    prearr=[]#保存预测
    for i in range(0, size):
        temparr=[]
        for j in range(0, xsize):
            char = tagger.x(i, j)
            temparr.append(char)
        tag = tagger.y2(i)
        temparr.append(tag)
        prearr.append(temparr)
    # print(prearr)
    starr=[]#保存实体
    numarr=[]#保存数值
    dwarr=[]#保存单位
    for i in range(len(prearr)):
        # 搜索实体
        tempstr = ""
        if prearr[i][2] == "w":
            starr.append(prearr[i][0])
        if prearr[i][2] == "b":
            tempstr = tempstr + prearr[i][0]
            for j in range(i + 1, len(prearr)):
                if prearr[j][2] == "m" or prearr[j][2] == "e":
                    tempstr = tempstr + prearr[j][0]
                else:
                    break
            starr.append(tempstr)
        if prearr[i][1] == "m":
            if prearr[i-1][1]=='v':
                numarr.append([prearr[i-1][0],prearr[i][0]])
            else:
                numarr.append(prearr[i][0])
        if prearr[i][1] == "q" :
            dwarr.append(prearr[i][0])
    print("实体:",starr)
    print("数值:",numarr)
    print("单位:",dwarr)
    return starr,numarr,dwarr

Supongo que te gusta

Origin blog.csdn.net/m0_49621298/article/details/111006708
Recomendado
Clasificación