1. 程式人生 > >pyhanlp 分詞與詞性標註

pyhanlp 分詞與詞性標註

pyhanlp中的分詞器簡介

pyhanlp實現的分詞器有很多,同時pyhanlp獲取hanlp中分詞器也有兩種方式

第一種是直接從封裝好的hanlp類中獲取,這種獲取方式一共可以獲取五種分詞器,而現在預設的就是第一種維特比分詞器

  • 維特比 (viterbi):效率和效果的最佳平衡。也是最短路分詞,HanLP最短路求解採用Viterbi演算法
  • 雙陣列trie樹 (dat):極速詞典分詞,千萬字元每秒(可能無法獲取詞性,此處取決於你的詞典)
  • 條件隨機場 (crf):分詞、詞性標註與命名實體識別精度都較高,適合要求較高的NLP任務
  • 感知機 (perceptron):分詞、詞性標註與命名實體識別,支援線上學習
  • N最短路 (nshort):命名實體識別稍微好一些,犧牲了速度

第二種方式是使用JClass直接獲取java類,然後使用。這種方式除了獲取上面的五種分詞器以外還可以獲得一些其他分詞器,如NLP分詞器,索引分詞,快速詞典分詞等等

兩種使用方式的對比

第一種是使用作者給的HanLP直接獲取分詞器,直接segment() 會獲取 預設的標準分詞器也就是維特比分詞器,也**可以使用newSegment函式,傳入上面的分詞器英文名稱來獲取新的分詞器,如使用HanLP.newSegment("crf")來獲取CRF分詞器。**第二種方式是使用JClass從java中獲取我們想要的類,好在這兩種方式都比較方便。除此之外要注意的是,在pyhanlp中還給出了SafeJClass類,其為JClass的執行緒安全版,你也可以使用SafeClass來代替JClass。不過好在HanLP中的很多類本身已經實現了執行緒安全,因此許多時候兩者是可以相互替代的。

from pyhanlp import *
# 第一個demo

print(HanLP.segment("你好,歡迎使用HanLP漢語處理包!接下來請從其他Demo中體驗HanLP豐富的功能~"))

# HanLP詞性標註集: http://www.hankcs.com/nlp/part-of-speech-tagging.html#h2-8
[你好/vl, ,/w, 歡迎/v, 使用/v, HanLP/nx, 漢語/gi, 處理/vn, 包/v, !/w, 接下來/vl, 請/v, 從/p, 其他/rzv, Demo/nx, 中/f, 體驗/v, HanLP/nx, 豐富/a, 的/ude1, 功能/n, ~/nx]
# 標準分詞
text = ( "舉辦紀念活動銘記二戰歷史,不忘戰爭帶給人類的深重災難,是為了防止悲劇重演,確保和平永駐;記二戰歷史,更是為了提醒國際社會,需要共同捍衛二戰勝利成果和國際公平正義,必須警惕和抵制在歷史認知和維護戰後國際秩序問題上的倒行逆施。" ) BasicTokenizer = JClass("com.hankcs.hanlp.tokenizer.BasicTokenizer") print(BasicTokenizer.segment(text)) import time start = time.time() for i in range(100000): HanLP.segment(text) cost_time = time.time() - start print("HanLP.segment :%.2f字每秒" % (len(text) * 100000 / cost_time)) start = time.time() for i in range(100000): BasicTokenizer.segment(text) cost_time = time.time() - start print("BasicTokenizer.segment :%.2f字每秒" % (len(text) * 100000 / cost_time))
[舉辦/v, 紀念活動/nz, 銘記/v, 二戰/n, 歷史/n, ,/w, 不忘/v, 戰爭/n, 帶給/v, 人類/n, 的/ude1, 深重/a, 災難/n, ,/w, 是/vshi, 為了/p, 防止/v, 悲劇/n, 重演/v, ,/w, 確保/v, 和平/n, 永駐/nz, ;/w, 記/v, 二戰/n, 歷史/n, ,/w, 更是/d, 為了/p, 提醒/v, 國際/n, 社會/n, ,/w, 需要/v, 共同/d, 捍衛/v, 二戰/n, 勝利/vn, 成果/n, 和/cc, 國際/n, 公平/a, 正義/n, ,/w, 必須/d, 警惕/v, 和/cc, 抵制/v, 在/p, 歷史/n, 認知/vn, 和/cc, 維護/v, 戰後/t, 國際/n, 秩序/n, 問題/n, 上/f, 的/ude1, 倒行逆施/vl, 。/w]
HanLP.segment :1518389.32字每秒
BasicTokenizer.segment :2415039.64字每秒

僅僅從剛剛的結果看,可能會不太理解為同一個分詞器效能差距這麼大?難道是因為中間程式碼的排程問題,其實也不是。將兩段程式碼前後互換之後,發現無論兩者怎麼排列,總是在前的速度較慢,在後的較快,因此應該是記憶體的問題,第二次呼叫時減少了部分記憶體的調動。所以同一個分詞器才會出現,第二次總比第一次快的現象。

標準分詞

  • 說明
    • HanLP中有一系列“開箱即用”的靜態分詞器,以Tokenizer結尾,在接下來的例子中會繼續介紹。
    • HanLP.segment其實是對StandardTokenizer.segment的包裝。
    • 分詞結果包含詞性,每個詞性的意思請查閱《HanLP詞性標註集》

單獨獲取詞性或者詞語

如你所見的是,前面print的結果是[詞語/詞性,詞語/詞性,/詞語/詞性…]的形式,那麼如果我們只想獲取詞語,或者詞性應該怎麼辦呢?

方法也很簡單。使用HanLP.Config.ShowTermNature = False修改配置,使其不顯示詞性即可。

如果想要只獲取詞性也是可以的,因為原分詞器返回的是Java中的ArrayList屬性,list中的每個單元都是一個term類,因此我們也可以通過獲取term中的word欄位來直接獲取詞語,或者nature屬性,直接獲取詞性。這一特徵,我們在之後也會用到。

因為HanLP中是預設開啟詞性標註的,所以在這裡我取名為分詞與詞性標註,但是因為篇幅原因這裡沒有對詞性標註作過多解釋,詳細內容請看“詞性標註(正篇)”

HanLP.Config.ShowTermNature = False
text = "小區居民有的反對餵養流浪貓"
CRFnewSegment = HanLP.newSegment("crf")
term_list = CRFnewSegment.seg(text)
print(term_list)
HanLP.Config.ShowTermNature = True


CRFnewSegment = HanLP.newSegment("crf")
term_list = CRFnewSegment.seg(text)
print(term_list)
print([str(i.word) for i in term_list])
print([str(i.nature) for i in term_list])
[小區, 居民, 有的, 反對, 喂, 養, 流, 浪, 貓]
[小區/n, 居民/n, 有的/r, 反對/v, 喂/v, 養/v, 流/v, 浪/n, 貓/v]
['小區', '居民', '有的', '反對', '喂', '養', '流', '浪', '貓']
['n', 'n', 'r', 'v', 'v', 'v', 'v', 'n', 'v']

其他分詞器的程式碼實現與速度對比

到這裡,分詞與詞性標註的主要功能其實已經講的差不多了,後邊是其他分詞器的程式碼展示以及部分其他內容,本人建議最起碼通讀一遍,如果只想獲取詞性或者詞語的話可以按照剛剛的寫法進行修改,如果需要了解原理則可以點開相應連結。

NLP 分詞

  • 說明
    • NLP分詞NLPTokenizer會執行詞性標註和命名實體識別,由結構化感知機序列標註框架支撐。
    • 預設模型訓練自9970萬字的大型綜合語料庫,是已知範圍內全世界最大的中文分詞語料庫。語料庫規模決定實際效果,面向生產環境的語料庫應當在千萬字量級。歡迎使用者在自己的語料上訓練新模型以適應新領域、識別新的命名實體。
# NLP分詞
# NLP分詞,更精準的中文分詞、詞性標註與命名實體識別

NLPTokenizer = JClass("com.hankcs.hanlp.tokenizer.NLPTokenizer")
print(NLPTokenizer.segment("我新造一個詞叫幻想鄉你能識別並正確標註詞性嗎?"))  # “正確”是副形詞。
# 注意觀察下面兩個“希望”的詞性、兩個“晚霞”的詞性
print(NLPTokenizer.analyze("我的希望是希望張晚霞的背影被晚霞映紅").translateLabels())
print(NLPTokenizer.analyze("支援臺灣正體香港繁體:微軟公司於1975年由比爾·蓋茲和保羅·艾倫創立。"))

print("\n==========||==========\n")

print("為了驗證NLP分詞與標準分詞的差異,我們在用text進行一次分詞")

pressure = 1000
start = time.time()
for i in range(pressure):
    BasicTokenizer.segment(text)
cost_time = time.time() - start
print("HanLP.segment :%.2f字每秒" % (len(text) * pressure / cost_time))
[我/r, 新/d, 造/v, 一個/m, 詞/n, 叫/v, 幻想鄉/ns, 你/r, 能/v, 識別/v, 並/c, 正確/ad, 標註/v, 詞性/n, 嗎/y, ?/w]
我/代詞 的/助詞 希望/名詞 是/動詞 希望/動詞 張晚霞/人名 的/助詞 背影/名詞 被/介詞 晚霞/名詞 映紅/人名
支援/v 臺灣/ns 正體/n 香港/ns 繁體/n :/v [微軟/nt 公司/n]/nt 於/p 1975年/t 由/p 比爾·蓋茲/n 和/c 保羅·艾倫/nr 創立/v 。/w

==========||==========

為了驗證NLP分詞與標準分詞的差異,我們在用text進行一次分詞
HanLP.segment :267563.45字每秒

索引分詞

  • 說明
    • 索引分詞IndexTokenizer是面向搜尋引擎的分詞器,能夠對長詞全切分,另外通過term.offset可以獲取單詞在文字中的偏移量。
    • 任何分詞器都可以通過基類SegmentenableIndexMode方法啟用索引模式。
from jpype import *

# 索引分詞

Term =JClass("com.hankcs.hanlp.seg.common.Term")
IndexTokenizer = JClass("com.hankcs.hanlp.tokenizer.IndexTokenizer")

term_list = IndexTokenizer.segment("主副食品")
for term in term_list.iterator():
    print("{} [{}:{}]".format(term, term.offset, term.offset + len(term.word)))

print("最細顆粒度切分:") # 此處對應jieba的搜尋引擎模式
IndexTokenizer.SEGMENT.enableIndexMode(JInt(1))  # JInt用於區分過載
term_list = IndexTokenizer.segment("主副食品")
for term in term_list.iterator():
    print("{} [{}:{}]".format(term, term.offset, term.offset + len(term.word)))

print("\n==========||==========\n")

print("現在索引分詞對text進行一次分詞")

import time
start = time.time()
pressure = 100000
for i in range(pressure):
    IndexTokenizer.segment(text)
cost_time = time.time() - start
print("IndexTokenizer.SEGMENT.enableIndexMode(JInt(1))-> 分詞速度:%.2f字每秒" % (len(text) * pressure / cost_time))
主副食品/n [0:4]
主副食/j [0:3]
主/ag [0:1]
副食品/n [1:4]
副食/n [1:3]
副/b [1:2]
食品/n [2:4]
食/v [2:3]
品/ng [3:4]
最細顆粒度切分:
主副食品/n [0:4]
主副食/j [0:3]
主/ag [0:1]
副食品/n [1:4]
副食/n [1:3]
副/b [1:2]
食品/n [2:4]
食/v [2:3]
品/ng [3:4]

==========||==========

現在索引分詞對text進行一次分詞
IndexTokenizer.SEGMENT.enableIndexMode(JInt(1))-> 分詞速度:494700.58字每秒

最短路分詞&N最短路分詞(寫法一)

  • 說明
    • N最短路分詞器NShortSegment比最短路分詞器慢,但是效果稍微好一些,對命名實體識別能力更強。
    • 一般場景下最短路分詞的精度已經足夠,而且速度比N最短路分詞器快幾倍,請酌情選擇。
sentences = [
    "今天,劉志軍案的關鍵人物,山西女商人丁書苗在市二中院出庭受審。",
    "江西省監獄管理局與中國太平洋財產保險股份有限公司南昌中心支公司保險合同糾紛案",
    "新北商貿有限公司",
]

NShortNewSegment = HanLP.newSegment("nshort")

for sentence in sentences:
    term_list = NShortNewSegment.seg(sentence)
    print(term_list)
    
import time
pressure = 10000

start = time.time()
for i in range(pressure):
    NShortNewSegment.seg(text)
cost_time = time.time() - start
print("NShortNewSegment 分詞速度:%.2f字每秒" % (len(text) * pressure / cost_time))
[今天/t, ,/w, 劉志軍/nr, 案/ng, 的/ude1, 關鍵/n, 人物/n, ,/w, 山西/ns, 女/b, 商人/nnt, 丁書苗/nr, 在/p, 市/n, 二/m, 中/f, 院/n, 出庭/vi, 受審/vi, 。/w]
[江西省/ns, 監獄/nis, 管理局/nis, 與/cc, 中國/ns, 太平洋/ns, 財產/n, 保險/n, 股份/n, 有限公司/nis, 南昌/ns, 中心/nis, 支公司/nis, 保險/n, 合同/n, 糾紛案/nz]
[新/a, 北/f, 商貿/n, 有限公司/nis]
NShortNewSegment 分詞速度:208784.50字每秒

最短路分詞&N最短路分詞(寫法二)

# 最短路分詞&N最短路分詞

NShortSegment = JClass("com.hankcs.hanlp.seg.NShort.NShortSegment")
Segment = JClass("com.hankcs.hanlp.seg.Segment")
ViterbiSegment = JClass("com.hankcs.hanlp.seg.Viterbi.ViterbiSegment")

nshort_segment = NShortSegment().enableCustomDictionary(
    False).enablePlaceRecognize(True).enableOrganizationRecognize(True)
shortest_segment = ViterbiSegment().enableCustomDictionary(
    False).enablePlaceRecognize(True).enableOrganizationRecognize(True)

for sentence in sentences:
    print("N-最短分詞:{} \n最短路分詞:{}".format(
        nshort_segment.seg(sentence), shortest_segment.seg(sentence)))
    
    
print("\n==========||==========\n")

print("下面對最短路徑分詞器與N最短路徑分詞器進行速度對比")
import time
pressure = 10000

start = time.time()
for i in range(pressure):
    nshort_segment.seg(text)
cost_time = time.time() - start
print("nshort_segment分詞速度:%.2f字每秒" % (len(text) * pressure / cost_time))

start = time.time()
for i in range(pressure):
    shortest_segment.seg(text)
cost_time = time.time() - start
print("shortest_segment分詞速度:%.2f字每秒" % (len(text) * pressure / cost_time))
N-最短分詞:[今天/t, ,/w, 劉志軍/nr, 案/ng, 的/ude1, 關鍵/n, 人物/n, ,/w, 山西/ns, 女/b, 商人/nnt, 丁書苗/nr, 在/p, 市二中院/nt, 出庭/vi, 受審/vi, 。/w] 
最短路分詞:[今天/t, ,/w, 劉志軍/nr, 案/ng, 的/ude1, 關鍵/n, 人物/n, ,/w, 山西/ns, 女/b, 商人/nnt, 丁書苗/nr, 在/p, 市/n, 二中院/nt, 出庭/vi, 受審/vi, 。/w]
N-最短分詞:[江西省監獄管理局/nt, 與/cc, 中國/ns, 太平洋/ns, 財產保險股份有限公司南昌中心支公司/nt, 保險/n, 合同/n, 糾紛案/nz] 
最短路分詞:[江西省監獄管理局/nt, 與/cc, 中國/ns, 太平洋/ns, 財產保險股份有限公司南昌中心支公司/nt, 保險/n, 合同/n, 糾紛案/nz]
N-最短分詞:[新北商貿有限公司/nt] 
最短路分詞:[新北商貿有限公司/nt]

==========||==========

下面對最短路徑分詞器與N最短路徑分詞器進行速度對比
nshort_segment分詞速度:140187.31字每秒
shortest_segment分詞速度:321353.36字每秒

CRF分詞

# CRF分詞
# 原來的CRF分詞已經無法使用,架構發生了較大的改變
# 我們這裡使用新的架構,新的語法呼叫"link com.hankcs.hanlp.model.crf.CRFLexicalAnalyzer"來進行分詞

# 原作者為了能夠在將來HanLP升級時,能夠一直獲取合適的分類器
# 建立了 segment 的工廠方法,以下我寫的示範語法是通用的
# 關於更多newSegment 的引數,可以參考原始碼中的HanLP.java
# segment  則可以參考 Segment類
# 下面是原作者寫在 HanLP.java 裡的原文
"""
    /**
     * 建立一個分詞器,
     * 這是一個工廠方法<br>
     *
     * @param algorithm 分詞演算法,傳入演算法的中英文名都可以,可選列表:<br>
     *                  <ul>
     *                  <li>維特比 (viterbi):效率和效果的最佳平衡</li>
     *                  <li>雙陣列trie樹 (dat):極速詞典分詞,千萬字元每秒</li>
     *                  <li>條件隨機場 (crf):分詞、詞性標註與命名實體識別精度都較高,適合要求較高的NLP任務</li>
     *                  <li>感知機 (perceptron):分詞、詞性標註與命名實體識別,支援線上學習</li>
     *                  <li>N最短路 (nshort):命名實體識別稍微好一些,犧牲了速度</li>
     *                  <li>2階隱馬 (hmm2):訓練速度較CRF快</li> (已經廢除,筆者FT補充)
     *                  </ul>
     * @return 一個分詞器
     */
"""

sentence_array = [
    "HanLP是由一系列模型與演算法組成的Java工具包,目標是普及自然語言處理在生產環境中的應用。",
    "鐵桿部隊憤怒情緒集結 馬英九腹背受敵",  # 繁體無壓力
    "馬英九回應連勝文“丐幫說”:稱黨內同志談話應謹慎",
    "高錳酸鉀,強氧化劑,紫紅色晶體,可溶於水,遇乙醇即被還原。常用作消毒劑、水淨化劑、氧化劑、漂白劑、毒氣吸收劑、二氧化碳精製劑等。",
    "《夜晚的骰子》通過描述淺草的舞女在暗夜中扔骰子的情景,寄託了作者對庶民生活區的情感",
    "這個像是真的[委屈]前面那個打扮太江戶了,一點不上品[email protected]",
    "鼎泰豐的小籠一點味道也沒有...每樣都淡淡的...淡淡的,哪有食堂2A的好次",
    "克里斯蒂娜·克羅爾說:不,我不是虎媽。我全家都熱愛音樂,我也鼓勵他們這麼做。",
    "今日APPS:Sago Mini Toolbox培養孩子動手能力",
    "財政部副部長王保安調任國家統計局黨組書記",
    "2.34米男子娶1.53米女粉絲 稱夫妻生活沒問題",
    "你看過穆赫蘭道嗎",
    "國辦釋出網路提速降費十四條指導意見 鼓勵流量不清零",
    "樂視超級手機能否承載賈布斯的生態夢"
]


CRFnewSegment = HanLP.newSegment("crf")

for sentence in sentence_array:
    term_list = CRFnewSegment.seg(sentence)
    print(term_list)
    
import time
pressure = 10000

start = time.time()
for i in range(pressure):
    CRFnewSegment.seg(text)
cost_time = time.time() - start
print("CRFnewSegment分詞速度:%.2f字每秒" % (len(text) * pressure / cost_time))
[HanLP/nx, 是/v, 由/p, 一/m, 系列/q, 模型/n, 與/c, 演算法/n, 組成/v, 的/u, Java/vn, 工具/n, 包/v, ,/w, 目標/n, 是/v, 普及/v, 自然語言處理/v, 在/p, 生產/vn, 環境/n, 中的/vn, 應用/vn, 。/w]
[鐵桿/n, 部隊/n, 憤怒/vn, 情緒/n, 集結/vn,  馬英九/vn, 腹/Ng, 背/v, 受/v, 敵/Ng]
[馬英九/nr, 回/v, 應/v, 連/u, 勝/v, 文/Ng, “/w, 丐幫/nr, 說/v, ”/w, :/w, 稱/v, 黨內/s, 同志/n, 談話/v, 應/v, 謹慎/a]
[高錳/nr, 酸鉀/n, ,/w, 強氧化劑/n, ,/w, 紫紅色/n, 晶體/n, ,/w, 可/v, 溶於/v, 水/n, ,/w, 遇乙醇/v, 即/v, 被/p, 還原/v, 。/w, 常/d, 用/p, 作/v, 消毒劑/n, 、/w, 水/n, 淨化劑/n, 、/w, 氧化劑/n, 、/w, 漂白劑/n, 、/w, 毒氣/n, 吸收劑/n, 、/w, 二氧化碳/n, 精製劑/n, 等/u, 。/w]
[《/w, 夜晚/t, 的/u, 骰子/n, 》/w, 通過/p, 描述/v, 淺草/n, 的/u, 舞女/n, 在/p, 暗夜/n, 中/f, 扔/v, 骰子/n, 的/u, 情景/n, ,/w, 寄託/v, 了/u, 作者/n, 對/p, 庶民/n, 生活區/n, 的/u, 情感/n]
[這個/r, 像/v, 是/v, 真的/d, [/w, 委屈/n, ]/w, 前面/f, 那個/r, 打扮/v, 太江戶/n, 了/y, ,/w, 一點/m, 不/d, 上/v, 品[email protected]/n]
[鼎泰豐/nr, 的/u, 小籠/n, 一點/m, 味道/n, 也/d, 沒有/d, .../v, 每樣/r, 都/d, 淡淡/a, 的/u, .../n, 淡淡/a, 的/u, ,/w, 哪/r, 有/v, 食堂/n, 2A/m, 的/u, 好/a, 次/Bg]
[克里斯蒂娜·克羅爾/nr, 說/v, :/w, 不/d, ,/w, 我/r, 不/d, 是/v, 虎媽/n, 。/w, 我/r, 全家/n, 都/d, 熱愛/v, 音樂/n, ,/w, 我/r, 也/d, 鼓勵/v, 他們/r, 這麼/r, 做/v, 。/w]
[今日/t, A/nx, PPS/n, :/w, Sago Mini Toolbox/nx, 培養/v, 孩子/n, 動手/v, 能力/n]
[財政部/nt, 副/b, 部長/n, 王保安/nr, 調任/v, 國家統計局黨組/nt, 書記/n]
[2.34/m, 米/q, 男子/n, 娶/v, 1.53/m, 米/q, 女/b, 粉絲 /n, 稱/v, 夫妻/n, 生活/vn, 沒/v, 問題/n]
[你/r, 看/v, 過/u, 穆赫蘭道/n, 嗎/y]
[國辦/j, 釋出/v, 網路/n, 提/v, 速/Ng, 降費/n, 十四/m, 條/q, 指導/vn, 意見/n,  /v, 鼓勵/v, 流量/n, 不/d, 清/v, 零/m]
[樂視/v, 超級/b, 手機/n, 能否/v, 承載/v, 賈布斯/nr, 的/u, 生態夢/n]
CRFnewSegment分詞速度:38895.99字每秒

極速詞典分詞

DATnewSegment = HanLP.newSegment("dat")

for sentence in sentence_array:
    term_list = DATnewSegment.seg(sentence)
    print(term_list)
    
import time
pressure = 10000

start = time.time()
for i in range(pressure):
    DATnewSegment.seg(text)
cost_time = time.time() - start
print("DATnewSegment 分詞速度:%.2f字每秒" % (len(text) * pressure / cost_time))
[H/null, a/null, n/null, L/null, P/null, 是/null, 由/null, 一系列/null, 模型/null, 與/null, 演算法/null, 組成/null, 的/null, J/null, a/null, v/null, a/null, 工具包/null, ,/null, 目標/null, 是/null, 普及/null, 自然/null, 語言/null, 處理/null, 在/null, 生產/null, 環境/null, 中/null, 的/null, 應用/null, 。/null]
[鐵/null, 桿/null, 部/null, 隊/null, 憤/null, 怒/null, 情/null, 緒/null, 集/null, 結/null,  /null, 馬/null, 英/null, 九/null, 腹/null, 背/null, 受/null, 敵/null]
[馬/null, 英/null, 九/null, 回/null, 應/null, 連/null, 勝/null, 文/null, “/null, 丐/null, 幫/null, 說/null, ”/null, :/null, 稱/null, 黨/null, 內/null, 同志/null, 談/null, 話/null, 應/null, 謹/null, 慎/null]
[高錳酸鉀/null, ,/null, 強氧化劑/null, ,/null, 紫紅色/null, 晶體/null, ,/null, 可溶/null, 於/null, 水/null, ,/null, 遇/null, 乙醇/null, 即/null, 被/null, 還原/null, 。/null, 常用/null, 作/null, 消毒劑/null, 、/null, 水/null, 淨化/null, 劑/null, 、/null, 氧化劑/null, 、/null, 漂白劑/null, 、/null, 毒氣/null, 吸收劑/null, 、/null, 二氧化碳/null, 精製/null, 劑/null, 等/null, 。/null]
[《/null, 夜晚/null, 的/null, 骰子/null, 》/null, 通過/null, 描述/null, 淺草/null, 的/null, 舞女/null, 在/null, 暗夜/null, 中/null, 扔/null, 骰子/null, 的/null, 情景/null, ,/null, 寄託/null, 了/null, 作者/null, 對/null, 庶民/null, 生活區/null, 的/null, 情感/null]
[這個/null, 像/null, 是/null, 真的/null, [/null, 委屈/null, ]/null, 前面/null, 那個/null, 打扮/null, 太/null, 江戶/null, 了/null, ,/null, 一點/null, 不/null, 上/null, 品/null, ./null, ./null, ./null, @/null, h/null, a/null, n/null, k/null, c/null, s/null]
[鼎泰豐/null, 的/null, 小籠/null, 一點/null, 味道/null, 也/null, 沒有/null, ./null, ./null, ./null, 每樣/null, 都/null, 淡淡的/null, ./null, ./null, ./null, 淡淡的/null, ,/null, 哪/null, 有/null, 食堂/null, 2/null, A/null, 的/null, 好/null, 次/null]
[克里斯蒂娜/null, ·/null, 克/null, 羅/null, 爾/null, 說/null, :/null, 不/null, ,/null, 我/null, 不是/null, 虎媽/null, 。/null, 我/null, 全家/null, 都/null, 熱愛/null, 音樂/null, ,/null, 我/null, 也/null, 鼓勵/null, 他們/null, 這麼/null, 做/null, 。/null]
[今日/null, A/null, P/null, P/null, S/null, :/null, S/null, a/null, g/null, o/null,  /null, M/null, i/null, n/null, i/null,  /null, T/null, o/null, o/null, l/null, b/null, o/null, x/null, 培養/null, 孩子/null, 動手/null, 能力/null]
[財政部/null, 副部長/null, 王/null, 保安/null, 調任/null, 國家/null, 統計局/null, 黨組/null, 書記/null]
[2/null, ./null, 3/null, 4/null, 米/null, 男子/null, 娶/null, 1/null, ./null, 5/null, 3/null, 米/null, 女/null, 粉絲/null,  /null, 稱/null, 夫妻/null, 生活/null, 沒問題/null]
[你/null, 看過/null, 穆/null, 赫/null, 蘭/null, 道/null, 嗎/null]
[國辦/null, 釋出/null, 網路/null, 提速/null, 降/null, 費/null, 十/null, 四/null, 條/null, 指導/null, 意見/null,  /null, 鼓勵/null, 流量/null, 不/null, 清零/null]
[樂/null, 視/null, 超級/null, 手機/null, 能否/null, 承載/null, 賈/null, 布/null, 斯/null, 的/null, 生態/null, 夢/null]
DATnewSegment 分詞速度:652231.33字每秒

viterbi 維特比分詞

ViterbiNewSegment = HanLP.newSegment("viterbi")

for sentence in sentence_array:
    term_list = ViterbiNewSegment.seg(sentence)
    print(term_list)
    
import time
pressure = 10000

start = time.time()
for i in range(pressure):
    ViterbiNewSegment.seg(text)
cost_time = time.time() - start
print("ViterbiNewSegment 分詞速度:%.2f字每秒" % (len(text) * pressure / cost_time))
[HanLP/nx, 是/vshi, 由/p, 一系列/b, 模型/n, 與/cc, 演算法/n, 組成/v, 的/ude1, Java/nx, 工具包/n, ,/w, 目標/n, 是/vshi, 普及/v, 自然語言處理/nz, 在/p, 生產/vn, 環境/n, 中的/v, 應用/vn, 。/w]
[鐵/n, 桿/w, 部/q, 隊/n, 憤/w, 怒/vg, 情/n, 緒/n, 集/q, 結/n,  /w, 馬/nz, 英/b, 九/m, 腹/ng, 背/v, 受/v, 敵/w]
[馬/nz, 英/b, 九/m, 回/v, 應/w, 連/n, 勝/nz, 文/ng, “/w, 丐/n, 幫/nz, 說/v, ”/w, :/w, 稱/v, 黨/w, 內/nz, 同志/n, 談話/n, 應/w, 謹/n, 慎/ag]
[高錳酸鉀/nf, ,/w, 強氧化劑/gc, ,/w, 紫紅色/n, 晶體/n, ,/w, 可/v, 溶於/v, 水/n, ,/w, 遇/v, 乙醇/n, 即/v, 被/pbei, 還原/vi, 。/w, 常用/a, 作/v, 消毒劑/n, 、/w, 水/n, 淨化/vn, 劑/q, 、/w, 氧化劑/n, 、/w, 漂白劑/n, 、/w, 毒氣/n, 吸收劑/nz, 、/w, 二氧化碳/n, 精製/v, 劑/q, 等/udeng, 。/w]
[《/w, 夜晚/n, 的/ude1, 骰子/n, 》/w, 通過/p, 描述/v, 淺草/nz, 的/ude1, 舞女/n, 在/p, 暗夜/nz, 中/f, 扔/v, 骰子/n, 的/ude1, 情景/n, ,/w, 寄託/v, 了/ule, 作者/nnt, 對/p, 庶民/n, 生活區/n, 的/ude1, 情感/n]
[這個/rz, 像/v, 是/vshi, 真的/d, [/w, 委屈/a, ]/w, 前面/f, 那個/rz, 打扮/v, 太/d, 江戶/ns, 了/ule, ,/w, 一點/m, 不/d, 上品/n, .../w, @hankcs/nx]
[鼎泰豐/nz, 的/ude1, 小籠/nf, 一點/m, 味道/n, 也/d, 沒有/v, .../w, 每樣/nz, 都/d, 淡淡的/z, .../w, 淡淡的/z, ,/w, 哪/ry, 有/vyou, 食堂/n, 2/m, A/nx, 的/ude1, 好/a, 次/qv]
[克里斯蒂娜/nr, ·/w, 克/q, 羅爾/nr, 說/v, :/w, 不/d, ,/w, 我/rr, 不是/c, 虎媽/nz, 。/w, 我/rr, 全家/n, 都/d, 熱愛/v, 音樂/n, ,/w, 我/rr, 也/d, 鼓勵/v, 他們/rr, 這麼/rz, 做/v, 。/w]
[今日/t, APPS/nx, :/w, Sago/nx,  /w, Mini/nx,  /w, Toolbox/nx, 培養/v, 孩子/n, 動手/vi, 能力/n]
[財政部/nt, 副部長/nnt, 王保安/nr, 調任/v, 國家/n, 統計局/nis, 黨組/nis, 書記/nnt]
[2.34/m, 米/q, 男子/n, 娶/v, 1.53/m, 米/q, 女/b, 粉絲/nf,  /w, 稱/v, 夫妻/n, 生活/vn, 沒問題/nz]
[你/rr, 看過/v, 穆赫/nr, 蘭道/nr, 嗎/y]
[國辦/vn, 釋出/v, 網路/n, 提速/vn, 降/v, 費/n, 十四/m, 條/q, 指導/vn, 意見/n,  /w, 鼓勵/v, 流量/n, 不/d, 清零/nz]
[樂/a, 視/vg, 超級/b, 手機/n, 能否/v, 承載/v, 賈布斯/nr, 的/ude1, 生態/n, 夢/n]
ViterbiNewSegment 分詞速度:233386.22字每秒

感知器分詞

PerceptronNewSegment = HanLP.newSegment("perceptron")

for sentence in sentence_array:
    term_list = PerceptronNewSegment.seg(sentence)
    print(term_list)
    
import time
pressure = 10000

start = time.time()
for i in range(pressure):
    PerceptronNewSegment.seg(text)
cost_time = time.time() - start
print("PerceptronNewSegment 分詞速度:%.2f字每秒" % (len(text) * pressure / cost_time))
[HanLP/nx, 是/v, 由/p, 一系列/n, 模型/n, 與/c, 演算法/n, 組成/v, 的/u, Java/nx, 工具包/n, ,/w, 目標/n, 是/v, 普及/v, 自然語言處理/v, 在/p, 生產環境/l, 中的/u, 應用/vn, 。/w]
[鐵桿/n, 部隊/n, 憤怒/vn, 情緒/n, 集結 馬英九/vn, 腹背受敵/Ng]
[馬英九/nr, 回應/v, 連勝文/n, “/w, 丐幫/n, 說/v, ”/w, :/v, 稱/v, 黨內/s, 同志/n, 談話/v, 應/v, 謹慎/a]
[高錳酸鉀/nr, ,/w, 強/a, 氧化劑/n, ,/w, 紫紅色/n, 晶體/n, ,/w, 可/v, 溶於/v, 水/n, ,/w, 遇/v, 乙醇/n, 即/d, 被/p, 還原/v, 。/w, 常用/d, 作/v, 消毒劑/n, 、/w, 水/n, 淨化劑/n, 、/w, 氧化劑/n, 、/w, 漂白劑/n, 、/w, 毒氣/n, 吸收/v, 劑/n, 、/w, 二氧化碳/n, 精/a, 製劑/n, 等/u, 。/w]
[《/w, 夜晚/t, 的/u, 骰子/n, 》/w, 通過/p, 描述/v, 淺草/n, 的/u, 舞女/n, 在/p, 暗夜/t, 中/f, 扔/v, 骰子/n, 的/u, 情景/n, ,/w, 寄託/v, 了/u, 作者/n, 對/p, 庶民/n, 生活區/n, 的/u, 情感/n]
[這個/r, 像/n, 是/v, 真的/d, [/w, 委屈/vn, ]/w, 前面/f, 那個/r, 打扮/v, 太/d, 江戶/a, 了/y, ,/w, 一點/m, 不/d, 上品/v, [email protected]/Ng]
[鼎泰豐/nr, 的/u, 小籠/n, 一點/m, 味道/n, 也/d, 沒有/v, ...每樣/r, 都/d, 淡淡/z, 的/u, ...淡淡/z, 的/u, ,/w, 哪/r, 有/v, 食堂/n, 2/m, A/nx, 的/u, 好/a, 次/Bg]
[克里斯蒂娜·克羅爾/nr, 說/v, :/v, 不/d, ,/w, 我/r, 不是/c, 虎媽/n, 。/w, 我/r, 全家/n, 都/d, 熱愛/v, 音樂/n, ,/w, 我/r, 也/d, 鼓勵/v, 他們/r, 這麼/r, 做/v, 。/w]
[今日/t, APPS/nx, :/v, Sago Mini Toolbox/nx, 培養/v, 孩子/n, 動手/v, 能力/n]
[財政部/nt, 副部長/n, 王保安/nr, 調任/v, 國家統計局/nt, 黨組/n, 書記/n]
[2.34/m, 米/q, 男子/n, 娶/v, 1.53/m, 米/q, 女/b, 粉絲 稱夫妻/n, 生活/vn, 沒問題/n]
[你/r, 看過/v, 穆赫蘭道/n, 嗎/y]
[國辦/j, 釋出/vn, 網路/n, 提速/v, 降費/n, 十四/m, 條/q, 指導/v, 意見 鼓勵/v, 流量/n, 不/d, 清零/a]
[樂/a, 視/Vg, 超級/b, 手機/n, 能否/v, 承載/v, 賈布斯/nr, 的/u, 生態/n, 夢/n]
PerceptronNewSegment 分詞速度:58435.77字每秒

特殊的:HMM2 分詞

hmm2 不同於CRF,一開始在廢除之後並沒有替代的函式,但是原始碼中依舊保留了這介面,這是一個BUG,不過在我寫這個使用者指南期間,我已經報告了這個錯誤。在文章發表前,原作者已經修復了該問題。但是這事很有意思,所以還是留下了記錄(當然現在的報錯已經不一樣了)。同時在這裡也希望如果之後有人在發現錯誤之後,能夠報告錯誤為開源社群作出貢獻,而不僅僅是做一個受益者。

HMM2newSegment = HanLP.newSegment("hmm2")

for sentence in sentence_array:
    term_list = HMM2newSegment.seg(sentence)
    print(term_list)
    
import time
pressure = 10000

start = time.time()
for i in range(pressure):
    HMM2newSegment.seg(text)
cost_time = time.time() - start
print("HMM2newSegment 分詞速度:%.2f字每秒" % (len(text) * pressure / cost_time))
---------------------------------------------------------------------------

java.lang.IllegalArgumentExceptionPyRaisableTraceback (most recent call last)

<ipython-input-15-3cf032a3824c> in <module>()
----> 1 HMM2newSegment = HanLP.newSegment("hmm2")
      2 
      3 for sentence in sentence_array:
      4     term_list = HMM2newSegment.seg(sentence)
      5     print(term_list)


java.lang.IllegalArgumentExceptionPyRaisable: java.lang.IllegalArgumentException: 發生了異常:java.lang.IllegalArgumentException: HMM分詞模型[ /home/fonttian/anaconda3/lib/python3.6/site-packages/pyhanlp/static/data/model/segment/HMMSegmentModel.bin ]不存在
	at com.hankcs.hanlp.seg.HMM.HMMSegment.<init>(HMMSegment.java:51)
	at com.hankcs.hanlp.seg.HMM.HMMSegment.<init>(HMMSegment.java:36)
	at com.hankcs.hanlp.HanLP.newSegment(HanLP.java:680)

相關推薦

pyhanlp 詞性標註

pyhanlp中的分詞器簡介 pyhanlp實現的分詞器有很多,同時pyhanlp獲取hanlp中分詞器也有兩種方式 第一種是直接從封裝好的hanlp類中獲取,這種獲取方式一共可以獲取五種分詞器,而現在預設的就是第一種維特比分詞器 維特比 (viterbi):

自然語言處理工具pyhanlp詞性標註

Pyhanlp分詞與詞性標註的相關內容記得此前是有分享過的。可能時間太久記不太清楚了。以下文章是分享自“baiziyu”所寫(小部

jieba詞性標註自定義詞典支援特殊字元

jieba分詞可以自定義詞表和詞庫。但是目前版本尚不支援特殊字元(如空格等)。參考github上的網友們的解答,總結修改方法如下:1、修改目錄(我的為windows系統,使用miniconda,路徑供參考,具體則需要根據自己實際情況進行修改):檔案路徑 D:\ProgramD

HMM詞性標註、命名實體識別

HMM(隱馬爾可夫模型)是用來描述隱含未知引數的統計模型,舉一個經典的例子:一個東京的朋友每天根據天氣{下雨,天晴}決定當天的活動{公園散步,購物,清理房間}中的一種,我每天只能在twitter上看到她發的推“啊,我前天公園散步、昨天購物、今天清理房間了!”,那麼我可以根據她

HMM演算法-viterbi演算法的實現及詞性標註、命名實體識別的引用

轉自:http://www.hankcs.com/nlp/hmm-and-segmentation-tagging-named-entity-recognition.html HMM(隱馬爾可夫模型)是用來描述隱含未知引數的統計模型,舉一個經典的例子:一個東京的朋友每天

一套準確率高且效率高的詞性標註工具-thulac

軟體簡介 THULAC(THU Lexical Analyzer for Chinese)由清華大學自然語言處理與社會人文計算實驗室研製推出的一套中文詞法分析工具包,具有中文分詞和詞性標註功能。THULAC具有如下幾個特點: 能力強。利用我們整合的目前世界上規模最大的人工分詞和詞性標註中文語料庫(

用pyltp做詞性標註、ner

工具:win10、python2.7 主要參考官方文件 http://pyltp.readthedocs.io/zh_CN/latest/api.html# http://ltp.readthedocs.io/zh_CN/latest/install.html 1、安裝

文字處理(二)詞頻統計,jieba詞性標註,snownlp情感分析

這一篇接著上一篇處理後的資料進行操作,按照(一)中的步驟,這事應該將文字資料每一行中的高頻的正面詞去掉,因為多數是描述身體健康的短句,只有少數是描述脾臟檢查異常的,所以嘗試刪除掉描述身體健康的短句,只留下少數檢查異常的資料,對異常的檢查資料進行特徵提取,這是思路。所以這一篇目

Python 文字挖掘:jieba中文詞性標註

#! /usr/bin/env python2.7 #coding=utf-8 import jieba import jieba.posseg #需要另外載入一個詞性標註模組 string = '其實大家買手機就是看個心情,沒必要比來比去的。' seg = jieba.posseg.cut(string

Deep Learning 在中文詞性標註任務中的應用

開源軟體包 SENNA 和 word2vec 中都用到了詞向量(distributed word representation),當時我就在想,對於我們的中文,是不是也類似地有字向

結巴4--詞性標註

1 簡介 詞性(part-of-speech)是詞彙基本的語法範疇,通常也稱為詞類,主要用來描述一個詞在上下文的作用。例如,描述一個概念的詞就是名詞,在下文引用這個名詞的詞就是代詞。有的詞性經常會出現一些新的詞,例如名詞,這樣的詞性叫做開放式詞性。另外一些詞性

清華大學thulac詞性標註程式碼理解

     清華大學的thulac中分分詞詞法包,包含有中文分詞和詞性標註,從測試精度和速度看,效果還不錯,github上有提供c++和python程式碼,c++程式碼包含有訓練和測試程式碼,python程式碼只有測試程式碼,速度也較慢,github地址為:https://g

python3進行中文詞性標註

配置python環境(win10) 雙擊安裝,我安裝在了D:\python 中。 新增環境變數。 在我的電腦處右鍵 -> 高階系統設定 -> 環境變數 -> 系統變數 ->

jieba詞性標註

# ============================================================================= # jieba分詞 #import jieba # f1 =open("weibo.txt") # f2 =

jieba、自定義詞典提取高頻詞性標註及獲取的位置

準備工作 安裝anaconda環境,anaconda環境是一個強大的科學計算環境,自帶python2.7和3.4兩個版本以及很多科學計算庫 安裝完成後配置環境變數,然後在終端用pip install jieba安裝結巴分詞庫 jieba介紹 支援

jieba/pyhanlp簡單操作

jieba/pyhanlp分詞簡單操作 content = "現如今,機器學習和深度學習帶動人工智慧飛速的發展,並在圖片處理、語音識別領域取得巨大成功。" content = jieba.cut(content, cut_all=False) print('/'.joi

RAKE 中文 關鍵詞提取

import jieba import jieba.posseg as pseg import operator import json from collections import Counter # Data structure for holding data c

jieba工具詞性標記含義

jieba分詞詞性標記含義   jieba為自然語言語言中常用工具包,jieba不僅僅是一個分詞工具,它還具有對分詞的詞性進行標註的功能,詞性類別如下: Ag 形語素 形容詞性語素。形容詞程式碼為 a,語素程式碼g前面置以A

jiebaworldcloud

中文分詞的優秀庫。 安裝:pip install jieba 主要有三種模式,但是最主要有一個函式 模式:精確模式:把文字精確的切分開,不存在冗餘單詞   全模式:把文字中所有可能的詞語都掃描出來,有冗餘   搜尋引擎模式:在精確模式上,對長詞再次切分 函式:jieba.lcut(str):精確模

索引庫

分詞是很多做SEO的人常聽到的概念,為了讓大家在這個方面不會有疑惑,現在要來講一下分詞以及索引庫。這也是更深入的瞭解搜尋引擎的開始。 搜尋引擎每天都是在處理一個基本的需求:使用者搜尋一個關鍵詞,搜尋引擎馬上找到相關的網頁給使用者。這個過程要怎麼實現呢? 下面就分步來了解這個