1. 程式人生 > >十、半個小時搞定詞性標註與關鍵詞提取

十、半個小時搞定詞性標註與關鍵詞提取


想要做到和人聊天,首先得先讀懂對方在說什麼,所以問句解析是整個聊天過程的第一步,問句解析是一個涉及知識非常全面的過程,幾乎涵蓋了自然語言處理的全部,本節讓我們嘗試一下如何分析一個問句

問句解析的過程

一般問句解析需要進行分詞、詞性標註、命名實體識別、關鍵詞提取、句法分析以及查詢問句分類等。這些事情我們從頭開始做無非是重複造輪子,傻子才會這麼做,人之所以為人是因為會使用工具。網路上有關中文的NLP工具有很多,介紹幾個不錯的:

第一個要數哈工大的LTP(語言技術平臺)了,它可以做中文分詞、詞性標註、命名實體識別、依存句法分析、語義角色標註等豐富、 高效、精準的自然語言處理技術

第二個就是博森科技了,它除了做中文分詞、詞性標註、命名實體識別、依存文法之外還可以做情感分析、關鍵詞提取、新聞分類、語義聯想、時間轉換、新聞摘要等,但因為是商業化的公司,除了分詞和詞性標註免費之外全都收費

第三個就是jieba分詞,這個開源小工具分詞和詞性標註做的挺不錯的,但是其他方面還欠缺一下,如果只是中文分詞的需求完全可以滿足

第四個就是中科院張華平博士的NLPIR漢語分詞系統,也能支援關鍵詞提取

我們優先選擇NLPIR

NLPIR使用

首先安裝pynlpir庫

pip install pynlpir

寫個小程式測試一下分詞效果:

# coding:utf-8

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

import pynlpir

pynlpir.open()
s = '聊天機器人到底該怎麼做呢?'
segments = pynlpir.segment(s)
for
segment in segments: print segment[0], '\t', segment[1] pynlpir.close()

執行效果如下:

聊天     verb
機器人     noun
到底     adverb
該     verb
怎麼     pronoun
做     verb
呢     modal particle
?     punctuation mark

下面我們再繼續試下關鍵詞提取效果:

key_words = pynlpir.get_key_words(s, weighted=True)
for key_word in key_words:
    print
key_word[0], '\t', key_word[1]

輸出如下:

聊天     2.0
機器人     2.0

從這個小程式來看,分詞和關鍵詞提取效果很好

下面我們再來試驗一個,這一次我們把分析功能全開啟,部分程式碼如下:

s = '海洋是如何形成的'
segments = pynlpir.segment(s, pos_names='all')

執行後效果如下:

海洋     noun
是     verb:verb 是
如何     pronoun:interrogative pronoun:predicate interrogative pronoun
形成     verb
的     particle:particle 的/底
海洋     2.0
形成     2.0

如果我們把segments在加上一個引數pos_english=False,也就是不使用英語,那麼輸出就是

海洋     名詞
是     動詞:動詞"是"
如何     代詞:疑問代詞:謂詞性疑問代詞
形成     動詞
的     助詞:的/底
海洋     2.0
形成     2.0

解釋一下

這裡的segment是切詞的意思,返回的是tuple(token, pos),其中token就是切出來的詞,pos就是語言屬性

呼叫segment方法指定的pos_names引數可以是'all', 'child', 'parent',預設是parent, 表示獲取該詞性的最頂級詞性,child表示獲取該詞性的最具體的資訊,all表示獲取該詞性相關的所有詞性資訊,相當於從其頂級詞性到該詞性的一條路徑

詞性分類表

檢視nlpir的原始碼中的pynlpir/docs/pos_map.rst,可以看出全部詞性分類及其子類別如下:

    POS_MAP = {
        'n': ('名詞', 'noun', {
            'nr': ('人名', 'personal name', {
                'nr1': ('漢語姓氏', 'Chinese surname'),
                'nr2': ('漢語名字', 'Chinese given name'),
                'nrj': ('日語人名', 'Japanese personal name'),
                'nrf': ('音譯人名', 'transcribed personal name')
            }),
            'ns': ('地名', 'toponym', {
                'nsf': ('音譯地名', 'transcribed toponym'),
            }),
            'nt': ('機構團體名', 'organization/group name'),
            'nz': ('其它專名', 'other proper noun'),
            'nl': ('名詞性慣用語', 'noun phrase'),
            'ng': ('名詞性語素', 'noun morpheme'),
        }),
        't': ('時間詞', 'time word', {
            'tg': ('時間詞性語素', 'time morpheme'),
        }),
        's': ('處所詞', 'locative word'),
        'f': ('方位詞', 'noun of locality'),
        'v': ('動詞', 'verb', {
            'vd': ('副動詞', 'auxiliary verb'),
            'vn': ('名動詞', 'noun-verb'),
            'vshi': ('動詞"是"', 'verb 是'),
            'vyou': ('動詞"有"', 'verb 有'),
            'vf': ('趨向動詞', 'directional verb'),
            'vx': ('行事動詞', 'performative verb'),
            'vi': ('不及物動詞', 'intransitive verb'),
            'vl': ('動詞性慣用語', 'verb phrase'),
            'vg': ('動詞性語素', 'verb morpheme'),
        }),
        'a': ('形容詞', 'adjective', {
            'ad': ('副形詞', 'auxiliary adjective'),
            'an': ('名形詞', 'noun-adjective'),
            'ag': ('形容詞性語素', 'adjective morpheme'),
            'al': ('形容詞性慣用語', 'adjective phrase'),
        }),
        'b': ('區別詞', 'distinguishing word', {
            'bl': ('區別詞性慣用語', 'distinguishing phrase'),
        }),
        'z': ('狀態詞', 'status word'),
       'r': ('代詞', 'pronoun', {
            'rr': ('人稱代詞', 'personal pronoun'),
            'rz': ('指示代詞', 'demonstrative pronoun', {
                'rzt': ('時間指示代詞', 'temporal demonstrative pronoun'),
                'rzs': ('處所指示代詞', 'locative demonstrative pronoun'),
                'rzv': ('謂詞性指示代詞', 'predicate demonstrative pronoun'),
            }),
            'ry': ('疑問代詞', 'interrogative pronoun', {
                'ryt': ('時間疑問代詞', 'temporal interrogative pronoun'),
                'rys': ('處所疑問代詞', 'locative interrogative pronoun'),
                'ryv': ('謂詞性疑問代詞', 'predicate interrogative pronoun'),
            }),
            'rg': ('代詞性語素', 'pronoun morpheme'),
        }),
        'm': ('數詞', 'numeral', {
            'mq': ('數量詞', 'numeral-plus-classifier compound'),
        }),
        'q': ('量詞', 'classifier', {
            'qv': ('動量詞', 'verbal classifier'),
            'qt': ('時量詞', 'temporal classifier'),
        }),
        'd': ('副詞', 'adverb'),
        'p': ('介詞', 'preposition', {
            'pba': ('介詞“把”', 'preposition 把'),
            'pbei': ('介詞“被”', 'preposition 被'),
        }),
        'c': ('連詞', 'conjunction', {
            'cc': ('並列連詞', 'coordinating conjunction'),
        }),
        'u': ('助詞', 'particle', {
            'uzhe': ('著', 'particle 著'),
            'ule': ('了/嘍', 'particle 了/嘍'),
            'uguo': ('過', 'particle 過'),
            'ude1': ('的/底', 'particle 的/底'),
            'ude2': ('地', 'particle 地'),
            'ude3': ('得', 'particle 得'),
            'usuo': ('所', 'particle 所'),
            'udeng': ('等/等等/云云', 'particle 等/等等/云云'),
            'uyy': ('一樣/一般/似的/般', 'particle 一樣/一般/似的/般'),
            'udh': ('的話', 'particle 的話'),
            'uls': ('來講/來說/而言/說來', 'particle 來講/來說/而言/說來'),
            'uzhi': ('之', 'particle 之'),
            'ulian': ('連', 'particle 連'),
        }),
       'e': ('嘆詞', 'interjection'),
        'y': ('語氣詞', 'modal particle'),
        'o': ('擬聲詞', 'onomatopoeia'),
        'h': ('字首', 'prefix'),
        'k': ('字尾' 'suffix'),
        'x': ('字串', 'string', {
            'xe': ('Email字串', 'email address'),
            'xs': ('微博會話分隔符', 'hashtag'),
            'xm': ('表情符合', 'emoticon'),
            'xu': ('網址URL', 'URL'),
            'xx': ('非語素字', 'non-morpheme character'),
        }),
        'w': ('標點符號', 'punctuation mark', {
            'wkz': ('左括號', 'left parenthesis/bracket'),
            'wky': ('右括號', 'right parenthesis/bracket'),
            'wyz': ('左引號', 'left quotation mark'),
            'wyy': ('右引號', 'right quotation mark'),
            'wj': ('句號', 'period'),
            'ww': ('問號', 'question mark'),
            'wt': ('歎號', 'exclamation mark'),
            'wd': ('逗號', 'comma'),
            'wf': ('分號', 'semicolon'),
            'wn': ('頓號', 'enumeration comma'),
            'wm': ('冒號', 'colon'),
            'ws': ('省略號', 'ellipsis'),
            'wp': ('破折號', 'dash'),
            'wb': ('百分號千分號', 'percent/per mille sign'),
            'wh': ('單位符號', 'unit of measure sign'),
        }),
    }

好,這回我們一下子完成了分詞、詞性標註、關鍵詞提取。命名實體識別、句法分析以及查詢問句分類我們之後再研究