Git Product home page Git Product logo

monpa's Introduction

罔拍 MONPA: Multi-Objective NER POS Annotator

MONPA 罔拍是一個提供正體中文斷詞、詞性標註以及命名實體辨識的多任務模型。初期只有網站示範版本(http://nlp.tmu.edu.tw:8080/chunk),本計劃是將 monpa 包裝成可以 pip install 的 python package (最新版本 v0.3.1)。

最新版的 monpa model 是使用 pytorch 1.0 框架訓練出來的模型,所以在使用本版本前,請先安裝 torch 1.* 以上版本才能正常使用 monpa 套件。

公告

- 本次更新版本 v0.3.3:#16 升級 torch API 以解決警告訊息
- 更新版本 v0.3.2:解決 issue 10, 11 的建議,新增 short_sentence 斷句功能, cut_mp 及 cut_pseg 多執行程序功能等輔助程式。
- 更新版本 v0.3.1:新增運用 GPU 的批次斷詞功能 cut_batch 及 pseg_batch。
- 版本 v0.3.0:更小,更快,依然準確。完成 pip install 後不需要再另行下載模型檔。
- 公開釋出的 MONPA 僅供學術使用,請勿使用於商業用途。本團隊亦提供針對專業領域客製模型之服務,歡迎聯絡我們。

MONPA v0.2+ 版本是基於 BERT(雙向 Transformer)[1]模型來取得更強健的詞向量(word embeddings)並配合 CRF 同時進行斷詞、詞性標註、及 NER 等多個目標。已與 MONPA v0.1 版本有相當大差異,訓練語料亦與論文內容不同。

MONPA v0.3+ 版本基於 ALBERT [2] 重新訓練,大幅降低模型檔的大小,並加快執行效率。

[1] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova, NAACL-HLT 2019.

[2] ALBERT: A Lite BERT for Self-supervised Learning of Language Representations. Zhenzhong Lan, Mingda Chen, Sebastian Goodman, Kevin Gimpel, Piyush Sharma, Radu Soricut, ICLR 2020.

開發正體中文自然語言斷詞套件是一個基礎,接續的研究需要多方支持,歡迎您的捐款

monpa 各版本的斷詞效率比較圖

以上於 Google Colab 環境測試(monpa.cut 皆使用 CPU,monpa.cut_batch 使用 GPU)

注意

  1. 建議以原文輸入 monpa 完成斷詞後,再視需求濾掉停留字(stopword)及標點符號(punctuation)。
  2. 每次輸入到 monpa 做斷詞的原文超過 200 字元的部分將被截斷丟失,建議先完成合適長度分句後再應用 monpa 斷詞。可參考 wiki 如何將長文切成短句再用 monpa 斷詞?)自行開發或是使用 v0.3.2 (含)之後版本的功能程式 short_sentence 來協助分句。
  3. 支援 python >= 3.6,不支援 python 2.x。

安裝 monpa 套件

monpa 已經支援使用 pip 指令安裝,各作業系統的安裝步驟都相同。

pip install monpa

安裝時將自動檢查有無 torch >= 1.0 及 requests 等套件,若無則由 pip 直接安裝。Windows 作業系統需手動安裝,建議移駕 pytorch.org 取得最適合作業系統版本的安裝指令。

若已經安裝 monpa v0.2.x 版本,可以 pip install --upgrade monpa直接升級或是先以pip uninstall monpa 指令移除舊版本再行安裝新版本。

使用 monpa 的簡單範例

引入 monpa 的 python package。

import monpa

cut function

若只需要中文斷詞結果,請用 cut function,回傳值是 list 格式。簡單範例如下:

sentence = "蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。"
result_cut = monpa.cut(sentence)

for item in result_cut:
    print(item)

輸出

蔡英文
總統
今天


參加
台北市政府

舉辦

陽明山
馬拉松
比賽

pseg function

若需要中文斷詞及其 POS 結果,請用 pseg function,回傳值是 list of tuples 格式,簡單範例如下:

sentence = "蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。"
result_pseg = monpa.pseg(sentence)

for item in result_pseg:
    print(item)

輸出

('蔡英文', 'PER')
('總統', 'Na')
('今天', 'Nd')
('受', 'P')
('邀', 'VF')
('參加', 'VC')
('台北市政府', 'ORG')
('所', 'D')
('舉辦', 'VC')
('的', 'DE')
('陽明山', 'LOC')
('馬拉松', 'Na')
('比賽', 'Na')
('。', 'PERIODCATEGORY')

load_userdict function

如果需要自訂詞典,請依下列格式製作詞典文字檔,再使用此功能載入。簡單範例如下:

假設製作一個 userdict.txt 檔,每行含三部分,必須用「空格 (space)」隔開,依次是:詞語、詞頻(數值型態)、詞性(未能確定,請填 NER)。排序是以詞頻數值大者優先,若詞頻數值相同則排列前面者優先。

注意:最後不要留空行或任何空白空間。*

台北市政府 100 NER
受邀 100 V

當要使用自訂詞時,請於執行斷詞前先做 load_userdict,將自訂詞典載入到 monpa 模組。

請將本範例的 ./userdict.txt 改成實際放置自訂詞文字檔路徑及檔名。

monpa.load_userdict("./userdict.txt")

延用前例,用 pseg function,可發現回傳值已依自訂詞典斷詞,譬如「受邀」為一個詞而非先前的兩字分列輸出,「台北市政府」也依自訂詞輸出。

sentence = "蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。"
result_pseg_userdict = monpa.pseg(sentence)

for item in result_pseg_userdict:
    print(item)

輸出

('蔡英文', 'PER')
('總統', 'Na')
('今天', 'Nd')
('受邀', 'V')
('參加', 'VC')
('台北市政府', 'NER')
('所', 'D')
('舉辦', 'VC')
('的', 'DE')
('陽明山', 'LOC')
('馬拉松', 'Na')
('比賽', 'Na')
('。', 'PERIODCATEGORY')

cut_batch function

開始批次斷句前,請先啟動使用 GPU 之設定。

monpa.use_gpu(True)

從 monpa v0.3.1 開始提供應用 GPU 運算能力的 cut_batch function,輸入須為 list 格式,單批次的輸入量需考量 GPU 的記憶體容量,回傳值亦是 list 格式。初次啟動需耗費較多時間,建議若非大量斷詞,可使用 cut function 即可。簡單範例如下:

sentence_list = ["蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。", "蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。"]
result_cut_batch = monpa.cut_batch(sentence_list)

for item in result_cut_batch:
    print(item)

輸出

['蔡英文', '總統', '今天', '受', '邀', '參加', '台北市政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。']
['蔡英文', '總統', '今天', '受', '邀', '參加', '台北市政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。']

pseg_batch function

開始批次斷句前,請先啟動使用 GPU 之設定。

monpa.use_gpu(True)

從 monpa v0.3.1 開始提供應用 GPU 運算能力的 pseg_batch function,輸入須為 list 格式,單批次的輸入量需考量 GPU 的記憶體容量,回傳值亦是 list of turples 格式。初次啟動需耗費較多時間,建議若非大量斷詞,可使用 pseg function 即可。簡單範例如下:

sentence_list = ["蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。", "蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。"]
result_pseg_batch = monpa.pseg_batch(sentence_list)

for item in result_pseg_batch:
    print(item)

輸出

[('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'P'), ('邀', 'VF'), ('參加', 'VC'), ('台北市政府', 'ORG'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY')]
[('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'P'), ('邀', 'VF'), ('參加', 'VC'), ('台北市政府', 'ORG'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY')]

輔助功能程式( v0.3.2 開始提供)

utils.short_sentence function

開始使用輔助功能程式前,請先載入 monpa 附屬之 utils 功能。

from monpa import utils

基於 monpa 斷詞只處理 200 字元內的短句,所以建議先將長句分成多個短句再做斷詞才不會因過長語句而丟失斷詞。從 monpa v0.3.2 開始提供以 "。","!","?","," 依序為參考斷點的 short_sentence function,輸入須為 string 格式,回傳值是 list 格式。該功能程式將先尋找 200 字元內最後一個 "。" 為斷點,若無,則改以 "!" 為斷點,以此類推。若 200 字元內皆無法找到預設 4 個標點符號為斷點來分句,就直接從 200 字元處分句。簡單範例如下:

long_sentence = '''
蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。
'''
sentence_list = utils.short_sentence(long_sentence)
for item in sentence_list:
    print(item)

輸出

可以發現有 292 字元的 long_sentence 長句,經 utils.short_sentence 以 "。" 為斷點分成兩個短句。

蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽

utils.cut_mp function

從 monpa v0.3.1 開始提供應用 GPU 運算能力的 cut_batch function,但考量不是每台機器皆有 GPU,所以從 v0.3.2 開始提供多執行程序的功能程式來降低多量句子的斷詞耗時。輸入為 list 或是 list of list 格式,再依機器的 CPU 內核配備指定同時啟動的 worker 數量,回傳值是 list 或是 list of list 格式。初次啟動需耗費較多時間,建議若非大量斷詞,可使用 cut function 即可。簡單範例如下:

sentence_list = ['蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。', '蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。']

result_cut_mp = utils.cut_mp(sentence_list, 4) #本例是指定啟動 4 個 workers
print(result_cut_mp)

輸出

[['蔡英文', '總統', '今天', '受', '邀', '參加', '台北市政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。', '蔡英文', '總統', '今天', '受', '邀', '參加', '台北市', '政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。', '蔡英文', '總統', '今天', '受', '邀', '參加', '台北市', '政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。', '蔡英文', '總統', '今天', '受', '邀', '參加', '台北市', '政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。', '蔡英文', '總統', '今天', '受邀', '參加', '台北市', '政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。', '蔡英文', '總統', '今天', '受', '邀', '參加', '台北市', '政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。'], ['蔡英文', '總統', '今天', '受', '邀', '參加', '台北市政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。', '蔡英文', '總統', '今天', '受', '邀', '參加', '台北市政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。', '蔡英文', '總統', '今天', '受', '邀', '參加', '台北市', '政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。', '蔡英文', '總統', '今天', '受', '邀', '參加', '台北市', '政府', '所', '舉辦', '的', '陽明山', '馬拉松', '比賽', '。']]

utils.pseg_mp function

從 monpa v0.3.1 開始提供應用 GPU 運算能力的 cut_batch function,但考量不是每台機器皆有 GPU,所以從 v0.3.2 開始提供多執行程序的功能程式來降低多量句子的斷詞耗時。輸入為 list 或是 list of list 格式,再依機器的 CPU 內核配備指定同時啟動的 worker 數量,回傳值是 list 或是 list of list 格式。初次啟動需耗費較多時間,建議若非大量斷詞,可使用 pseg function 即可。簡單範例如下:

sentence_list = ['蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。', '蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。']

result_pseg_mp = utils.pseg_mp(sentence_list, 4) #本例是指定啟動 4 個 workers
print(result_pseg_mp)

輸出

[[('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'P'), ('邀', 'VF'), ('參加', 'VC'), ('台北市政府', 'ORG'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY'), ('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'VJ'), ('邀', 'VF'), ('參加', 'VC'), ('台北市', 'LOC'), ('政府', 'Na'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY'), ('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'VJ'), ('邀', 'VF'), ('參加', 'VC'), ('台北市', 'LOC'), ('政府', 'Na'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY'), ('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'VJ'), ('邀', 'VF'), ('參加', 'VC'), ('台北市', 'LOC'), ('政府', 'Nc'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY'), ('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受邀', 'VJ'), ('參加', 'VC'), ('台北市', 'LOC'), ('政府', 'Nc'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY'), ('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'VJ'), ('邀', 'VF'), ('參加', 'VC'), ('台北市', 'LOC'), ('政府', 'Na'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY')], [('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'P'), ('邀', 'VF'), ('參加', 'VC'), ('台北市政府', 'ORG'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY'), ('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'P'), ('邀', 'VF'), ('參加', 'VC'), ('台北市政府', 'ORG'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY'), ('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'VJ'), ('邀', 'VF'), ('參加', 'VC'), ('台北市', 'LOC'), ('政府', 'Na'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY'), ('蔡英文', 'PER'), ('總統', 'Na'), ('今天', 'Nd'), ('受', 'VJ'), ('邀', 'VF'), ('參加', 'VC'), ('台北市', 'LOC'), ('政府', 'Nc'), ('所', 'D'), ('舉辦', 'VC'), ('的', 'DE'), ('陽明山', 'LOC'), ('馬拉松', 'Na'), ('比賽', 'Na'), ('。', 'PERIODCATEGORY')]]

捐款

我們需要您的支持來延續開發自然語言的基礎設施程式,懇請捐款臺北醫學大學自然語言處理實驗室『人工智慧卓越創新計畫』。

其他

This project is inspired by our paper MONPA: Multi-objective Named-entity and Part-of-speech Annotator for Chinese using Recurrent Neural Network in which more information about the model detail can be found.

For your reference, although we list the paper here, it does NOT mean we use the exact same corpora when training the released model. The current MONPA is a new development by adopting the (AL)BERT model and a new paper will be published later. In the meantime, we list the original paper about the core ideas of MONPA for citation purposes.

Abstract

Part-of-speech (POS) tagging and named entity recognition (NER) are crucial steps in natural language processing. In addition, the difficulty of word segmentation places additional burden on those who intend to deal with languages such as Chinese, and pipelined systems often suffer from error propagation. This work proposes an end-to-end model using character-based recurrent neural network (RNN) to jointly accomplish segmentation, POS tagging and NER of a Chinese sentence. Experiments on previous word segmentation and NER datasets show that a single model with the proposed architecture is comparable to those trained specifically for each task, and outperforms freely-available softwares. Moreover, we provide a web-based interface for the public to easily access this resource.

Citation:

APA:

Hsieh, Y. L., Chang, Y. C., Huang, Y. J., Yeh, S. H., Chen, C. H., & Hsu, W. L. (2017, November). MONPA: Multi-objective Named-entity and Part-of-speech Annotator for Chinese using Recurrent Neural Network. In Proceedings of the Eighth International Joint Conference on Natural Language Processing (Volume 2: Short Papers) (pp. 80-85).

BibTex
@inproceedings{hsieh-etal-2017-monpa,
    title = "{MONPA}: Multi-objective Named-entity and Part-of-speech Annotator for {C}hinese using Recurrent Neural Network",
    author = "Hsieh, Yu-Lun  and
      Chang, Yung-Chun  and
      Huang, Yi-Jie  and
      Yeh, Shu-Hao  and
      Chen, Chun-Hung  and
      Hsu, Wen-Lian",
    booktitle = "Proceedings of the Eighth International Joint Conference on Natural Language Processing (Volume 2: Short Papers)",
    month = nov,
    year = "2017",
    address = "Taipei, Taiwan",
    publisher = "Asian Federation of Natural Language Processing",
    url = "https://www.aclweb.org/anthology/I17-2014",
    pages = "80--85",
    abstract = "Part-of-speech (POS) tagging and named entity recognition (NER) are crucial steps in natural language processing. In addition, the difficulty of word segmentation places additional burden on those who intend to deal with languages such as Chinese, and pipelined systems often suffer from error propagation. This work proposes an end-to-end model using character-based recurrent neural network (RNN) to jointly accomplish segmentation, POS tagging and NER of a Chinese sentence. Experiments on previous word segmentation and NER datasets show that a single model with the proposed architecture is comparable to those trained specifically for each task, and outperforms freely-available softwares. Moreover, we provide a web-based interface for the public to easily access this resource.",
}
Contact

Please feel free to contact monpa team by email. [email protected]

致謝

茲因模型開發初期使用**研究院中文詞知識庫小組開發之 CKIP 程式進行部分語料標註工作,後再經其他程序完成標註校正,感謝**研究院中文詞知識庫小組的協助。MONPA 於經**研究院中文詞知識庫小組同意下,使用 CKIP 斷詞元件輔助製作初期訓練資料。

Ma, Wei-Yun and Keh-Jiann Chen, 2003, "Introduction to CKIP Chinese Word Segmentation System for the First International Chinese Word Segmentation Bakeoff", Proceedings of ACL, Second SIGHAN Workshop on Chinese Language Processing, pp168-171.。

License

CC BY-NC-SA 4.0

Copyright (c) 2020 The MONPA team under the CC-BY-NC-SA 4.0 License. All rights reserved.

僅供學術使用,請勿使用於營利目的。若您需要應用 MONPA 於商業用途,請聯繫我們協助後續事宜。([email protected]

monpa's People

Contributors

windyeh avatar ylhsieh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

monpa's Issues

__init__.py會蓋掉所有logging設定

logging.basicConfig(format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s', \
                        datefmt = '%m/%d/%Y %H:%M:%S', \
                        level = logging.INFO)
logger = logging.getLogger(__name__)

這段會使得所有import monpa專案的module,在import階段logger就被蓋掉。建議至少拿掉level=logging.INFO這行,不然所有使用monpa的專案都會無法使用DEBUG等級,或者被迫在所有import monpa的模組裡面override掉這個設定。

RuntimeError: unexpected EOF, expected 2095002 more bytes. The file might be corrupted.

env

  • win10
  • python 3.7.3
  • torch==1.1.0

my code:

import monpa
sentence = "蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。"
result = monpa.cut(sentence)

for t in result:
    print(t)

Result:

+---------------------------------------------------------------------+
  Welcome to use MONPA: Multi-Objective NER POS Annotator for Chinese
+---------------------------------------------------------------------+
Good, we can found the model file
07/25/2019 14:17:06 - INFO - monpa -   running on device cpu
Traceback (most recent call last):
  File "c:\Users\Tom Chen\.vscode\extensions\ms-python.python-2019.5.18875\pythonFiles\ptvsd_launcher.py", line 43, in <module>
    main(ptvsdArgs)
  File "c:\Users\Tom Chen\.vscode\extensions\ms-python.python-2019.5.18875\pythonFiles\lib\python\ptvsd\__main__.py", line 434, in main
    run()
  File "c:\Users\Tom Chen\.vscode\extensions\ms-python.python-2019.5.18875\pythonFiles\lib\python\ptvsd\__main__.py", line 312, in run_file
    runpy.run_path(target, run_name='__main__')
  File "c:\programdata\anaconda3\Lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "c:\programdata\anaconda3\Lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "c:\programdata\anaconda3\Lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "d:\Codes\PythonPlayground\monpa_test.py", line 1, in <module>
    import monpa
  File "d:\Codes\PythonPlayground\env\lib\site-packages\monpa\__init__.py", line 128, in <module>
    checkpoint_dict = torch.load(args.model, map_location='cpu')
  File "d:\Codes\PythonPlayground\env\lib\site-packages\torch\serialization.py", line 387, in load
    return _load(f, map_location, pickle_module, **pickle_load_args)
  File "d:\Codes\PythonPlayground\env\lib\site-packages\torch\serialization.py", line 581, in _load
    deserialized_objects[key]._set_from_file(f, offset, f_should_read_directly)
RuntimeError: unexpected EOF, expected 2095002 more bytes. The file might be corrupted.

Note:
This error only occurs at first time

how to run on gpu?

發現加入user_dict,
切分詞跑得很慢,
有提供可以跑在gpu的方法嗎?

Compatibility with spacy?

Hello,

謝謝你們的分享,想請教一下,目前Monpa套件有方法,或是計劃,能夠整合在spacy language model當中嗎?謝謝回覆!

Unsupported string type: <class 'list'>

試著在自己的伺服器上架設web api
一開始都沒問題,今天突然出現以下錯誤,請問如何解決? 謝謝

File "/home/shilik/hug_api/lib/python3.10/site-packages/monpa/__init__.py", line 390, in pseg
[wsgi:error] [pid 1672] [client 192.168.0.17:57731]     text = convert_to_unicode(text)
  File "/home/shilik/hug_api/lib/python3.10/site-packages/monpa/tokenization.py", line 56, in convert_to_unicode
  raise ValueError("Unsupported string type: %s" % (type(text)))
 ValueError: Unsupported string type: <class 'list'>

Fix to avoid return empty result if user dict has empty line


+++ __init__.py	2020-04-14 22:09:55.000000000 +0800
@@ -246,7 +246,7 @@
     # empty previous userdict
     _userdict = []
     for input_item in io.open(pathtofile, 'r', encoding="utf-8").read().split("\n"):
-        _userdict.append(input_item.split(" "))
+        if input_item: _userdict.append(input_item.split(" "))

 def findall(p, s):
     ''' Yields all the positions of the pattern p in the string s```

分詞錯誤:AssertionError: lengths ['名嘴'] (words) and ['Na', 'VI'] (pos tags) mismatch

我在分詞的時候不知道為什麼出現這個錯誤
在此回報,請測試看看

Traceback (most recent call last):
File "monpaseg_from_sql.py", line 45, in
stmts = stmts.compute()
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\dask\base.py", line 175, in compute
(result,) = compute(self, traverse=False, **kwargs)
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\dask\base.py", line 446, in compute
results = schedule(dsk, keys, **kwargs)
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\dask\threaded.py", line 82, in get
**kwargs
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\dask\local.py", line 491, in get_async
raise_exception(exc, tb)
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\dask\compatibility.py", line 130, in reraise
raise exc
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\dask\local.py", line 233, in execute_task
result = execute_task(task, data)
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\dask\core.py", line 119, in execute_task
return func(*args2)
File "monpaseg_from_sql.py", line 27, in generate_update_monpa_stmt
seg_newscontent = monpa_seg(row_contains_title_and_content[2], config_filepath=commonvar_file_path)
File "E:\Software\scripts\python\ML_DL_final\segmentation_functions.py", line
39, in monpa_seg
cuttedwords = [monpa.cut(sent) for sent in sents]
File "E:\Software\scripts\python\ML_DL_final\segmentation_functions.py", line
39, in
cuttedwords = [monpa.cut(sent) for sent in sents]
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\monpa_init
.py", line 410, in cut
return cut_w_userdict(text)
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\monpa_init
.py", line 327, in cut_w_userdict
conll_formatted, segmented_words, pos_tags = to_CoNLL_format(sentence, model_out)
File "C:\ProgramData\Miniconda3\envs\tensorflow\lib\site-packages\monpa_init_.py", line 210, in to_CoNLL_format
(segmented_words), (pos_tags))
AssertionError: lengths ['名嘴'] (words) and ['Na', 'VI'] (pos tags) mismatch

jupyter notebook 的 import monpa 問題

PY新手請問

不好意思,請問一下,使用anaconda開啟的jupyter notebook沒辨法import monpa,使用dos指令開啟的jupyter notebook沒問題,謝謝

How to dismiss message of " Welcome to MONPA: Multi-Objective NER POS Annotator for Chinese"

@windyeh
Apache server的error log 都會出現以下的wsgi:error
在cli下執行雖然也會有同樣的字樣,但不會有錯誤。請教如何關掉這類的message使其不要出現wsgi:error?
謝謝

[Wed Mar 06 12:13:47.823665 2024] [wsgi:error] [pid 6932] +---------------------------------------------------------------------+ [Wed Mar 06 12:13:47.823691 2024] [wsgi:error] [pid 6932] Welcome to MONPA: Multi-Objective NER POS Annotator for Chinese [Wed Mar 06 12:13:47.823694 2024] [wsgi:error] [pid 6932] +---------------------------------------------------------------------+ [Wed Mar 06 12:13:47.851108 2024] [wsgi:error] [pid 6932] \xe5\xb7\xb2\xe6\x89\xbe\xe5\x88\xb0 model\xe6\xaa\x94\xe3\x80\x82Found model file.

自訂辭典導致分詞出現重複詞

example of user's dictionary
賣弄風騷的人 1000 NER
獨領世界風騷 1000 NER
獨領風騷 1000 NER
賣弄風騷 1000 NER
帶領風騷 1000 NER
領風騷 1000 NER
風騷 1000 NER

print(monpa.cut("15檔龍年雙旺領風騷"))

['15', '檔', '龍年', '雙', '旺領', '風騷']

monpa.load_userdict(file_path_to_dict)

print(monpa.cut("15檔龍年雙旺領風騷"))

['15', '檔', '龍年', '雙', '旺', '領風騷', '風騷']

============================================
example of user's 2nd dictionary (remove 風騷 1000 NER)
賣弄風騷的人 1000 NER
獨領世界風騷 1000 NER
獨領風騷 1000 NER
賣弄風騷 1000 NER
帶領風騷 1000 NER
領風騷 1000 NER

print(monpa.cut("15檔龍年雙旺領風騷"))

['15', '檔', '龍年', '雙', '旺領', '風騷']

monpa.load_userdict(file_path_to_dict)

print(monpa.cut("15檔龍年雙旺領風騷"))

['15', '檔', '龍年', '雙', '旺', '領風騷']

downloading model 404?

http 404: http://nlp.tmu.edu.tw/monpa_model/model-511.pt

/monpa/init.py in
73 with open(path_model, 'wb') as f:
74 r = requests.get(download_model_url, stream=True)
---> 75 total_length = int(r.headers.get('content-length'))
76 print("Total file size:", total_length, "KB")
77 dl = 0

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

I guess you have changed the link?

AttributeError: module 'monpa' has no attribute 'cut'

import monpa
sentence = "蔡英文總統今天受邀參加台北市政府所舉辦的陽明山馬拉松比賽。"
result = monpa.cut(sentence)

for t in result:
print(t)

Traceback (most recent call last):
File "monpa.py", line 1, in
import monpa
File "/Users/jay/py/tmu/monpa.py", line 5, in
result = monpa.cut(sentence)
AttributeError: module 'monpa' has no attribute 'cut'

Python 3.6.8 :: Anaconda custom (64-bit) / MacOS & Ubuntu16
1.Can't Download model-511.pt
2. Error Code AttributeError: module 'monpa' has no attribute 'cut'

Need to upgrade torch API

Got the following warning:

crf_layer.py:374: UserWarning: where received a uint8 condition tensor. 
This behavior is deprecated and will be removed in a future version of PyTorch. 
Use a boolean condition instead. 

Need to upgrade crf_layer and other callers.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.