【NLP】干貨!Python NLTK結合stanford NLP工具包進行文本處理


干貨!詳述Python NLTK下如何使用stanford NLP工具包

作者:白寧超

2016年11月6日19:28:43

摘要:NLTK是由賓夕法尼亞大學計算機和信息科學使用python語言實現的一種自然語言工具包,其收集的大量公開數據集、模型上提供了全面、易用的接口,涵蓋了分詞、詞性標注(Part-Of-Speech tag, POS-tag)、命名實體識別(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各項 NLP 領域的功能。而Stanford NLP 是由斯坦福大學的 NLP 小組開源的 Java 實現的 NLP 工具包,同樣對 NLP 領域的各個問題提供了解決辦法。斯坦福大學的 NLP 小組是世界知名的研究小組,能將 NLTK 和 Stanford NLP 這兩個工具包結合起來使用,那對於自然語言開發者是再好不過的!在 2004 年 Steve Bird 在 NLTK 中加上了對 Stanford NLP 工具包的支持,通過調用外部的 jar 文件來使用 Stanford NLP 工具包的功能。本分析顯得非常方便好用。本文主要介紹NLTK(Natural language Toolkit)下配置安裝Stanford NLP ,以及對Standford NLP核心模塊進行演示,使讀者簡單易懂的學習本章知識,后續會繼續采用大秦帝國語料對分詞、詞性標注、命名實體識別、句法分析、句法依存分析進行詳細演示。關於python基礎知識,可以參看【Python五篇慢慢彈】系列文章本文原創編著,轉載注明出處:干貨!詳述Python NLTK下如何使用stanford NLP工具包

目錄


【Python NLP】干貨!詳述Python NLTK下如何使用stanford NLP工具包(1)

【Python NLP】Python 自然語言處理工具小結(2)

【Python NLP】Python NLTK 走進大秦帝國(3)

【Python NLP】Python NLTK獲取文本語料和詞匯資源(4)

【Python NLP】Python NLTK處理原始文本(5)

1 NLTK和StandfordNLP簡介


NLTK:由賓夕法尼亞大學計算機和信息科學使用python語言實現的一種自然語言工具包,其收集的大量公開數據集、模型上提供了全面、易用的接口,涵蓋了分詞、詞性標注(Part-Of-Speech tag, POS-tag)、命名實體識別(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各項 NLP 領域的功能。

Stanford NLP:由斯坦福大學的 NLP 小組開源的 Java 實現的 NLP 工具包,同樣對 NLP 領域的各個問題提供了解決辦法。斯坦福大學的 NLP 小組是世界知名的研究小組,能將 NLTK 和 Stanford NLP 這兩個工具包結合起來使用,那對於自然語言開發者是再好不過的!在 2004 年 Steve Bird 在 NLTK 中加上了對 Stanford NLP 工具包的支持,通過調用外部的 jar 文件來使用 Stanford NLP 工具包的功能。本分析顯得非常方便好用。

本文在主要介紹NLTK 中提供 Stanford NLP 中的以下幾個功能:

  1. 中英文分詞: StanfordTokenizer
  2. 中英文詞性標注: StanfordPOSTagger
  3. 中英文命名實體識別: StanfordNERTagger
  4. 中英文句法分析: StanfordParser
  5. 中英文依存句法分析: StanfordDependencyParser, StanfordNeuralDependencyParser

2 安裝配置過程中注意事項


本文以Python 3.5.2和java version "1.8.0_111"版本進行配置,具體安裝需要注意以下幾點:

  • Stanford NLP 工具包需要 Java 8 及之后的版本,如果出錯請檢查 Java 版本
  • 本文的配置都是以 Stanford NLP 3.6.0 為例,如果使用的是其他版本,請注意替換相應的文件名
  • 本文的配置過程以 NLTK 3.2 為例,如果使用 NLTK 3.1,需要注意該舊版本中 StanfordSegmenter 未實現,其余大致相同
  • 下面的配置過程是具體細節可以參照:http://nlp.stanford.edu/software/

3 StandfordNLP必要工具包下載


必要包下載:只需要下載以下3個文件就夠了,stanfordNLTK文件里面就是StanfordNLP工具包在NLTK中所依賴的jar包和相關文件

  1. stanfordNLTK :自己將所有需要的包和相關文件已經打包在一起了,下面有具體講解
  2. Jar1.8 :如果你本機是Java 8以上版本,可以不用下載了
  3. NLTK :這個工具包提供Standford NLP接口

以上文件下載后,Jar如果是1.8的版本可以不用下載,另外兩個壓縮包下載到本地,解壓后拷貝文件夾到你的python安裝主路徑下,然后cmd進入NLTK下通過python setup.py install即可。后面操作講路徑簡單修改即可。(如果不能正常分詞等操作,查看python是否是3.2以上版本,java是否是8以后版本,jar環境變量是否配置正確)

StanfordNLTK目錄結構如下:(從各個壓縮文件已經提取好了,如果讀者感興趣,下面有各個功能的源碼文件

  • 分詞依賴:stanford-segmenter.jar、 slf4j-api.jar、data文件夾相關子文件
  • 命名實體識別依賴:classifiers、stanford-ner.jar
  • 詞性標注依賴:models、stanford-postagger.jar
  • 句法分析依賴:stanford-parser.jar、stanford-parser-3.6.0-models.jar、classifiers
  • 依存語法分析依賴:stanford-parser.jar、stanford-parser-3.6.0-models.jar、classifiers 

壓縮包下載和源碼分析

  1. 分詞壓縮包:StanfordSegmenter和StanfordTokenizer:下載stanford-segmenter-2015-12-09.zip (version 3.6.0) 解壓獲取目錄中的 stanford-segmenter-3.6.0.jar 拷貝為 stanford-segmenter.jar和 slf4j-api.jar
  2. 詞性標注壓縮包:下載stanford-postagger-full-2015-12-09.zip (version 3.6.0) 解壓獲取stanford-postagger.jar
  3. 命名實體識別壓縮包:下載stanford-ner-2015-12-09.zip (version 3.6.0) ,將解壓獲取stanford-ner.jar和classifiers文件
  4. 句法分析、句法依存分析:下載stanford-parser-full-2015-12-09.zip (version 3.6.0) 解壓獲取stanford-parser.jar 和 stanford-parser-3.6.0-models.jar

4 StandfordNLP相關核心操作


4.1 分詞

StanfordSegmenter 中文分詞:下載52nlp改過的NLTK包nltk-develop ,解壓后將其拷貝到你的python目錄下,進去E:\Python\nltk-develop采用python 編輯器打開setup.py文件,F5運行,輸入以下代碼:

>>> from nltk.tokenize.stanford_segmenter import StanfordSegmenter
>>> segmenter = StanfordSegmenter(
    path_to_jar=r"E:\tools\stanfordNLTK\jar\stanford-segmenter.jar",
    path_to_slf4j=r"E:\tools\stanfordNLTK\jar\slf4j-api.jar",
    path_to_sihan_corpora_dict=r"E:\tools\stanfordNLTK\jar\data",
    path_to_model=r"E:\tools\stanfordNLTK\jar\data\pku.gz",
    path_to_dict=r"E:\tools\stanfordNLTK\jar\data\dict-chris6.ser.gz"
)
>>> str="我在博客園開了一個博客,我的博客名叫伏草惟存,寫了一些自然語言處理的文章。"
>>> result = segmenter.segment(str)
>>> result

執行結果

程序解讀StanfordSegmenter 的初始化參數說明:

  • path_to_jar: 用來定位jar包,本程序分詞依賴stanford-segmenter.jar(注: 其他所有 Stanford NLP 接口都有 path_to_jar 這個參數。)
  • path_to_slf4j: 用來定位slf4j-api.jar作用於分詞
  • path_to_sihan_corpora_dict: 設定為 stanford-segmenter-2015-12-09.zip 解壓后目錄中的 data 目錄, data 目錄下有兩個可用模型 pkg.gz 和 ctb.gz 需要注意的是,使用 StanfordSegmenter 進行中文分詞后,其返回結果並不是 list ,而是一個字符串,各個漢語詞匯在其中被空格分隔開。

StanfordTokenizer 英文分詞 :相關參考資料

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> from nltk.tokenize import StanfordTokenizer
>>> tokenizer = StanfordTokenizer(path_to_jar=r"E:\tools\stanfordNLTK\jar\stanford-parser.jar")
>>> sent = "Good muffins cost $3.88\nin New York.  Please buy me\ntwo of them.\nThanks."
>>> print(tokenizer.tokenize(sent))
['Good', 'muffins', 'cost', '$', '3.88', 'in', 'New', 'York', '.', 'Please', 'buy', 'me', 'two', 'of', 'them', '.', 'Thanks', '.']
>>> 

執行結果:

4.2 命名實體識別

StanfordNERTagger 英文命名實體識別

>>> from nltk.tag import StanfordNERTagger
>>> eng_tagger = StanfordNERTagger(model_filename=r'E:\tools\stanfordNLTK\jar\classifiers\english.all.3class.distsim.crf.ser.gz',path_to_jar=r'E:\tools\stanfordNLTK\jar\stanford-ner.jar')
>>> print(eng_tagger.tag('Rami Eid is studying at Stony Brook University in NY'.split()))
[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), ('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'), ('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'O')]

運行結果

StanfordNERTagger 中文命名實體識別

>>> result
'四川省 成都 信息 工程 大學 我 在 博客 園 開 了 一個 博客 , 我 的 博客 名叫 伏 草 惟 存 , 寫 了 一些 自然語言 處理 的 文章 。\r\n'
>>> from nltk.tag import StanfordNERTagger
>>> chi_tagger = StanfordNERTagger(model_filename=r'E:\tools\stanfordNLTK\jar\classifiers\chinese.misc.distsim.crf.ser.gz',path_to_jar=r'E:\tools\stanfordNLTK\jar\stanford-ner.jar')
>>> for word, tag in  chi_tagger.tag(result.split()):
	print(word,tag)

運行結果

 

4.3 詞性標注

StanfordPOSTagger 英文詞性標注

>>> from nltk.tag import StanfordPOSTagger
>>> eng_tagger = StanfordPOSTagger(model_filename=r'E:\tools\stanfordNLTK\jar\models\english-bidirectional-distsim.tagger',path_to_jar=r'E:\tools\stanfordNLTK\jar\stanford-postagger.jar')
>>> print(eng_tagger.tag('What is the airspeed of an unladen swallow ?'.split()))

運行結果

StanfordPOSTagger 中文詞性標注

>>> from nltk.tag import StanfordPOSTagger
>>> chi_tagger = StanfordPOSTagger(model_filename=r'E:\tools\stanfordNLTK\jar\models\chinese-distsim.tagger',path_to_jar=r'E:\tools\stanfordNLTK\jar\stanford-postagger.jar')
>>> result
'四川省 成都 信息 工程 大學 我 在 博客 園 開 了 一個 博客 , 我 的 博客 名叫 伏 草 惟 存 , 寫 了 一些 自然語言 處理 的 文章 。\r\n'
>>> print(chi_tagger.tag(result.split()))

 運行結果

4.4 句法分析參考文獻資料

StanfordParser英文語法分析

>>> from nltk.parse.stanford import StanfordParser
>>> eng_parser = StanfordParser(r"E:\tools\stanfordNLTK\jar\stanford-parser.jar",r"E:\tools\stanfordNLTK\jar\stanford-parser-3.6.0-models.jar",r"E:\tools\stanfordNLTK\jar\classifiers\englishPCFG.ser.gz")
>>> print(list(eng_parser.parse("the quick brown fox jumps over the lazy dog".split())))

運行結果

StanfordParser 中文句法分析

>>> from nltk.parse.stanford import StanfordParser
>>> chi_parser = StanfordParser(r"E:\tools\stanfordNLTK\jar\stanford-parser.jar",r"E:\tools\stanfordNLTK\jar\stanford-parser-3.6.0-models.jar",r"E:\tools\stanfordNLTK\jar\classifiers\chinesePCFG.ser.gz")
>>> sent = u'北海 已 成為 中國 對外開放 中 升起 的 一 顆 明星'
>>> print(list(chi_parser.parse(sent.split())))

運行結果

4.5 依存句法分析

StanfordDependencyParser 英文依存句法分析 

>>> from nltk.parse.stanford import StanfordDependencyParser
>>> eng_parser = StanfordDependencyParser(r"E:\tools\stanfordNLTK\jar\stanford-parser.jar",r"E:\tools\stanfordNLTK\jar\stanford-parser-3.6.0-models.jar",r"E:\tools\stanfordNLTK\jar\classifiers\englishPCFG.ser.gz")
>>> res = list(eng_parser.parse("the quick brown fox jumps over the lazy dog".split()))
>>> for row in res[0].triples():
    print(row)

運行結果

StanfordDependencyParser 中文依存句法分析

>>> from nltk.parse.stanford import StanfordDependencyParser
>>> chi_parser = StanfordDependencyParser(r"E:\tools\stanfordNLTK\jar\stanford-parser.jar",r"E:\tools\stanfordNLTK\jar\stanford-parser-3.6.0-models.jar",r"E:\tools\stanfordNLTK\jar\classifiers\chinesePCFG.ser.gz")
>>> res = list(chi_parser.parse(u'四川 已 成為 中國 西部 對外開放 中 升起 的 一 顆 明星'.split()))
>>> for row in res[0].triples():
    print(row)

運行結果

 

5 參考文獻和知識擴展


  1. NLTK官方網站
  2. NLTK的API
  3. NLTK中使用斯坦福中文分詞器
  4. GitHub上NLTK源碼

 

 

修正:本文之前相關jra不完整,完整代碼請進QQ下載

機器學習和自然語言QQ群:436303759

自然語言處理和機器學習QQ交流群:436303759

【微信公眾號:datathinks】
自然語言處理和機器學習微信公眾號:datathinks

源碼請進QQ群文件下載:

圖5-1 完整項目文件

運行效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM