利用好手头的资源解决海量语料资源收集以及利用哈工大的LTP云平台解决依存句法和语义依存分析
一、利用好手頭的資源解決海量語料資源
基于語料做機器學習需要海量數據支撐,如何能不存一點數據獲取海量數據呢?我們可以以互聯網為強大的數據后盾,搜索引擎為我們提供了高效的數據獲取來源,結構化的搜索結果展示為我們實現了天然的特征基礎,唯一需要我們做的就是在海量結果中選出我們需要的數據,本節我們來探索如何利用互聯網拿到我們所需的語料資源?
請尊重原創,轉載請注明來源網站www.shareditor.com以及原始鏈接地址
關鍵詞提取
互聯網資源無窮無盡,如何獲取到我們所需的那部分語料庫呢?這需要我們給出特定的關鍵詞,而基于問句的關鍵詞提取上一節已經做了介紹,利用pynlpir庫可以非常方便地實現關鍵詞提取,比如:
# coding:utf-8import sys reload(sys) sys.setdefaultencoding( "utf-8" )import pynlpirpynlpir.open() s = '怎么才能把電腦里的垃圾文件刪除'key_words = pynlpir.get_key_words(s, weighted=True) for key_word in key_words:print key_word[0], '\t', key_word[1]pynlpir.close()提取出的關鍵詞如下:
電腦 2.0 垃圾 2.0 文件 2.0 刪除 1.0?
我們基于這四個關鍵詞來獲取互聯網的資源就可以得到我們所需要的語料信息
?
充分利用搜索引擎
有了關鍵詞,想獲取預料信息,還需要知道幾大搜索引擎的調用接口,首先我們來探索一下百度,百度的接口是這樣的:
https://www.baidu.com/s?wd=機器學習 數據挖掘 信息檢索
把wd參數換成我們的關鍵詞就可以拿到相應的結果,我們用程序來嘗試一下:
首先創建scrapy工程,執行:
scrapy startproject baidu_search自動生成了baidu_search目錄和下面的文件(不知道怎么使用scrapy,請見我的文章教你成為全棧工程師(Full Stack Developer) 三十-十分鐘掌握最強大的python爬蟲)
創建baidu_search/baidu_search/spiders/baidu_search.py文件,內容如下:
# coding:utf-8import sys reload(sys) sys.setdefaultencoding( "utf-8" )import scrapyclass BaiduSearchSpider(scrapy.Spider):name = "baidu_search"allowed_domains = ["baidu.com"]start_urls = ["https://www.baidu.com/s?wd=機器學習"]def parse(self, response):print response.body這樣我們的抓取器就做好了,進入baidu_search/baidu_search/目錄,執行:
scrapy crawl baidu_search我們發現返回的數據是空,下面我們修改配置來解決這個問題,修改settings.py文件,把ROBOTSTXT_OBEY改為
ROBOTSTXT_OBEY = False并把USER_AGENT設置為:
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'為了避免抓取hang住,我們添加如下超時設置:
DOWNLOAD_TIMEOUT = 5再次執行
scrapy crawl baidu_search這次終于可以看到大片大片的html了,我們臨時把他寫到文件中,修改parse()函數如下:
def parse(self, response):filename = "result.html"with open(filename, 'wb') as f:f.write(response.body)重新執行后生成了result.html,我們用瀏覽器打開本地文件如下:
說明我們抓取到了正確的結果
?
語料提取
上面得到的僅是搜索結果,它只是一種索引,真正的內容需要進入到每一個鏈接才能拿到,下面我們嘗試提取出每一個鏈接并繼續抓取里面的內容,那么如何提取鏈接呢,我們來分析一下result.html這個抓取百度搜索結果文件
?
我們可以看到,每一條鏈接都是嵌在class=c-container這個div里面的一個h3下的a標簽的href屬性
請尊重原創,轉載請注明來源網站www.shareditor.com以及原始鏈接地址
所以我們的提取規則就是:
hrefs = response.selector.xpath('//div[contains(@class, "c-container")]/h3/a/@href').extract()修改parse()函數并添加如下代碼:
hrefs = response.selector.xpath('//div[contains(@class, "c-container")]/h3/a/@href').extract()for href in hrefs:print href?
執行打印出:
…… 2016-06-30 09:22:51 [scrapy] DEBUG: Crawled (200) <GET https://www.baidu.com/s?wd=%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0> (referer: None) http://www.baidu.com/link?url=ducktBaLUAdceZyTkXSyx3nDbgLHoYlDVgAGlxPwcNNrOMQrbatubNKGRElo0VWua26AC7JRD2pLxFcaUBjcOq http://www.baidu.com/link?url=PGU6qW3zUb9g5uMT3W1O4VxPmoH-Fg-jolx8rBmBAeyOuXUl0wHzzNPkX3IDS5ZFSSSHyaBTjHd5f2r8CXBFjSctF9SGKaVock5xaJNuBCy http://www.baidu.com/link?url=JMirHAkIRJWI_9Va7HNc8zXWXU7JeTYhPGe66cOV4Zi5LH-GB7IQvVng4Gn35IiVhsUYP3IFyn6MKRl4_-byca http://www.baidu.com/link?url=Et9xy9Qej4XRmLB9UdFUlWD_AugxoDxQt-BZHCFyZEDPYzEx52vL_jsr_AvkNLHC-TfLThm0dKs21IGR1QA6h_ http://www.baidu.com/link?url=Ajb1DXzWj9A6KAYicHl4wS4RV6iDuy44kP_j-G0rbOHYQy5IR5JOigxbJERsqyH3 http://www.baidu.com/link?url=uRDMnVDsmS7sD4frNv8EHd2jKSvOB5PtqxeT8Q7MFzRyHPIVTYyiWEGNReHAbRymMnWOxqF_CSQOXL87v3o4qa http://www.baidu.com/link?url=18j6NZUp8fknmM1nUYIfsmep5H0JD39k8bL7CkACFtKdD4whoTuZy0ZMsCxZzZOj http://www.baidu.com/link?url=TapnMj78otilz-AR1NddZCSfG2vqcPYGNCYRu9_z70rmAKWqIVAvjV06iJvcvuECGDbwAefdsAmGRHba6TDpFMV1Pk-_JRs_bt9iE4T3bVi http://www.baidu.com/link?url=b1j-GMumC7s5eDXTHIMPpsdL7HtxrP4Rb_kw0GNo3z2ZSlkhLVd_4aFEzflPGArPHv7VBtZ1xbyHo3JtG0PEZq http://www.baidu.com/link?url=dG3GISijkExWf6Sy6Zn1xk_k--eGPUl1BrTCLRBxUOaS4jlrpX-PzV618-5hrCeos2_Rzaqrh0SecqYPloZfbyaj6wHSfbJHG9kFTvY6Spi 2016-06-30 09:22:51 [scrapy] INFO: Closing spider (finished) ……?
下面我們把這些url添加到抓取隊列中繼續抓取,修改baidu_search.py文件,如下:
def parse(self, response):hrefs = response.selector.xpath('//div[contains(@class, "c-container")]/h3/a/@href').extract()for href in hrefs:yield scrapy.Request(href, callback=self.parse_url)def parse_url(self, response):print len(response.body)?
抓取效果如下:
…… 2016-06-30 09:26:52 [scrapy] DEBUG: Crawled (200) <GET https://www.baidu.com/s?wd=%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0> (referer: None) 2016-06-30 09:26:52 [scrapy] DEBUG: Redirecting (302) to <GET http://book.douban.com/subject/1102235/> from <GET http://www.baidu.com/link?url=S1kmtqU1ZBDaSKlVXdeKfNtyv7fErWDMC_TuOEXdedXEe2DzoMqRbMdbejbC4vts4MHm5NQUIRbk0Y0QdohY5_> 2016-06-30 09:26:52 [scrapy] DEBUG: Redirecting (302) to <GET http://www.kuqin.com/shuoit/20140512/339858.html> from <GET http://www.baidu.com/link?url=_6fKf9IjO_EJ4hw91Y6RnfXnqS5u8VmwvDsJh3tduapsgXKQb-nMjsxMRPLW1bt5JlnzJPgOobHQwyHTgkWolK> 2016-06-30 09:26:52 [scrapy] DEBUG: Redirecting (302) to <GET http://wenku.baidu.com/link?url=7pAXoiFZz4alDMOjp-41OJaONe3B86GMEiFu96bqQy8qakk37vouey5Q-SxL7oN-r9mnNukKgVjN8iOloEKQoeEmgKLzukIFkX_rpr3dhy3> from <GET http://www.baidu.com/link?url=7pAXoiFZz4alDMOjp-41OJaONe3B86GMEiFu96bqQy8qakk37vouey5Q-SxL7oN-r9mnNukKgVjN8iOloEKQoeEmgKLzukIFkX_rpr3dhy3> 2016-06-30 09:26:52 [scrapy] DEBUG: Redirecting (302) to <GET http://blog.csdn.net/zouxy09/article/details/16955347> from <GET http://www.baidu.com/link?url=5dh-19wDKE_agNpwz_9YTm01wHLJ9IxBfrZPVWo6RfFECGmIW7bt0vk6POhWDN04O4QHem_v8-iYLTzoeXmQZK> 2016-06-30 09:26:52 [scrapy] DEBUG: Redirecting (302) to <GET http://open.163.com/special/opencourse/machinelearning.html> from <GET http://www.baidu.com/link?url=ti__XlRN8Oij0rFvqxfTtJz-dLhng6NANkAVwwISlHQ4nKOhRXNSJQhzekflnnFuuW5033lDRcqywOlqrzoANUhB0yQf3Nq-pXMWmBQO7x7> 2016-06-30 09:26:52 [scrapy] DEBUG: Redirecting (302) to <GET http://www.guokr.com/group/262/> from <GET http://www.baidu.com/link?url=cuifybqWoLRMULYGe70JCzyrZMEKL9GgfAa6V7p_7ONb7Q6KzXPad5zMfIYsKqN6> 2016-06-30 09:26:52 [scrapy] DEBUG: Redirecting (302) to <GET http://mooc.guokr.com/course/16/Machine-Learning/> from <GET http://www.baidu.com/link?url=93Yp_GA3ZLnSwjN5YREAML4sP5BthETto8Psn7ty5VJHoMB95gWhKTT6iDBFHeAfHjDhqwCf-NBrgeoP7YD1zq> 2016-06-30 09:26:52 [scrapy] DEBUG: Redirecting (302) to <GET http://tieba.baidu.com/f?kw=%BB%FA%C6%F7%D1%A7%CF%B0&fr=ala0&tpl=5> from <GET http://www.baidu.com/link?url=EjCvUWhJWV1_FEgNyetjTAu6HqImgl-A2229Lp8Kl3BfpcqlrSLOUabc-bzgn6KD1Wbg_s547FunrFp79phQTqXuIx6tkn9NGBhSqxhYUhm> 2016-06-30 09:26:52 [scrapy] DEBUG: Redirecting (302) to <GET http://www.geekpark.net/topics/213883/> from <GET http://www.baidu.com/link?url=kvdmirs22OQAj10KSbGstZJtf8L74bTgd4p1AxYk6c2B9lP_8_nSrLNDlfb9DHW7> ……看起來能夠正常抓取啦,下面我們把抓取下來的網頁提取出正文并盡量去掉標簽,如下:
def parse_url(self, response):print remove_tags(response.selector.xpath('//body').extract()[0])?
下面,我們希望把百度搜索結果中的摘要也能夠保存下來作為我們語料的一部分,如下:
def parse(self, response):hrefs = response.selector.xpath('//div[contains(@class, "c-container")]/h3/a/@href').extract()containers = response.selector.xpath('//div[contains(@class, "c-container")]')for container in containers:href = container.xpath('h3/a/@href').extract()[0]title = remove_tags(container.xpath('h3/a').extract()[0])c_abstract = container.xpath('div/div/div[contains(@class, "c-abstract")]').extract()abstract = ""if len(c_abstract) > 0:abstract = remove_tags(c_abstract[0])request = scrapy.Request(href, callback=self.parse_url)request.meta['title'] = titlerequest.meta['abstract'] = abstractyield requestdef parse_url(self, response):print "url:", response.urlprint "title:", response.meta['title']print "abstract:", response.meta['abstract']content = remove_tags(response.selector.xpath('//body').extract()[0])print "content_len:", len(content)?
解釋一下,首先我們在提取url的時候順便把標題和摘要都提取出來,然后通過scrapy.Request的meta傳遞到處理函數parse_url中,這樣在抓取完成之后也能接到這兩個值,然后提取出content,這樣我們想要的數據就完整了:url、title、abstract、content
百度搜索數據幾乎是整個互聯網的鏡像,所以你想要得到的答案,我們的語料庫就是整個互聯網,而我們完全借助于百度搜索引擎,不必提前存儲任何資料,互聯網真是偉大!
之后這些數據想保存在什么地方就看后面我們要怎么處理了,欲知后事如何,且聽下面分解
二、利用哈工大的LTP云平臺解決依存句法和語義依存分析
句法分析是自然語言處理中非常重要的環節,沒有句法分析是無法讓計算機理解語言的含義的,依存句法分析由法國語言學家在1959年提出,影響深遠,并且深受計算機行業青睞,依存句法分析也是做聊天機器人需要解決的最關鍵問題之一,語義依存更是對句子更深層次的分析,當然,有可用的工具我們就不重復造輪子,本節介紹如何利用國內領先的中文語言技術平臺實現句法分析?
什么是依存句法分析呢?
叫的晦澀的術語,往往其實灰常簡單,句法就是句子的法律規則,也就是句子里成分都是按照什么法律規則組織在一起的。而依存句法就是這些成分之間有一種依賴關系。什么是依賴:沒有你的話,我存在就是個錯誤。“北京是中國的首都”,如果沒有“首都”,那么“中國的”存在就是個錯誤,因為“北京是中國的”表達的完全是另外一個意思了。
?
什么是語義依存分析呢?
“語義”就是說句子的含義,“張三昨天告訴李四一個秘密”,那么語義包括:誰告訴李四秘密的?張三。張三告訴誰一個秘密?李四。張三什么時候告訴的?昨天。張三告訴李四什么?秘密。
?
語義依存和依存句法的區別
依存句法強調介詞、助詞等的劃分作用,語義依存注重實詞之間的邏輯關系
另外,依存句法隨著字面詞語變化而不同,語義依存不同字面詞語可以表達同一個意思,句法結構不同的句子語義關系可能相同。
?
依存句法分析和語義依存分析對我們的聊天機器人有什么意義呢?
依存句法分析和語義分析相結合使用,對對方說的話進行依存和語義分析后,一方面可以讓計算機理解句子的含義,從而匹配到最合適的回答,另外如果有已經存在的依存、語義分析結果,還可以通過置信度匹配來實現聊天回答。
?
依存句法分析到底是怎么分析的呢?
依存句法分析的基本任務是確定句式的句法結構(短語結構)或句子中詞匯之間的依存關系。依存句法分析最重要的兩棵樹:
依存樹:子節點依存于父節點
依存投射樹:實線表示依存聯結關系,位置低的成分依存于位置高的成分,虛線為投射線
?
依存關系的五條公理
1. 一個句子中只有一個成分是獨立的
2. 其他成分直接依存于某一成分
3. 任何一個成分都不能依存于兩個或兩個以上的成分
4. 如果A成分直接依存于B成分,而C成分在句子中位于A和B之間,那么C或者直接依存于B,或者直接依存于A和B之間的某一成分
5. 中心成分左右兩面的其他成分相互不發生關系
?
什么地方存在依存關系呢?比如合成詞(如:國內)、短語(如:英雄聯盟)很多地方都是
?
LTP依存關系標記
主謂關系 | SBV | subject-verb | 我送她一束花 (我 <-- 送) |
動賓關系 | VOB | 直接賓語,verb-object | 我送她一束花 (送 --> 花) |
間賓關系 | IOB | 間接賓語,indirect-object | 我送她一束花 (送 --> 她) |
前置賓語 | FOB | 前置賓語,fronting-object | 他什么書都讀 (書 <-- 讀) |
兼語 | DBL | double | 他請我吃飯 (請 --> 我) |
定中關系 | ATT | attribute | 紅蘋果 (紅 <-- 蘋果) |
狀中結構 | ADV | adverbial | 非常美麗 (非常 <-- 美麗) |
動補結構 | CMP | complement | 做完了作業 (做 --> 完) |
并列關系 | COO | coordinate | 大山和大海 (大山 --> 大海) |
介賓關系 | POB | preposition-object | 在貿易區內 (在 --> 內) |
左附加關系 | LAD | left adjunct | 大山和大海 (和 <-- 大海) |
右附加關系 | RAD | right adjunct | 孩子們 (孩子 --> 們) |
獨立結構 | IS | independent structure | 兩個單句在結構上彼此獨立 |
核心關系 | HED | head | 指整個句子的核心 |
請尊重原創,轉載請注明來源網站www.shareditor.com以及原始鏈接地址
那么依存關系是怎么計算出來的呢?
是通過機器學習和人工標注來完成的,機器學習依賴人工標注,那么都哪些需要我們做人工標注呢?分詞詞性、依存樹庫、語義角色都需要做人工標注,有了這寫人工標注之后,就可以做機器學習來分析新的句子的依存句法了
?
?
LTP云平臺怎么用?
首先注冊用戶,得到每月免費20G的流量,在http://www.ltp-cloud.com/注冊一個賬號,注冊好后登陸并進入你的dashboard:http://www.ltp-cloud.com/dashboard/,可以看到自己唯一的api_key,我的保密,就不貼出來了,在dashboard里還可以查詢自己流量使用情況
具體使用方法如下(參考http://www.ltp-cloud.com/document):
curl -i "http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國人。&pattern=dp&format=plain"把這里的YourApiKey換成你自己的api_key,得到結果如下:
我_0 是_1 SBV 是_1 -1 HED 中國_2 人_3 ATT 人_3 是_1 VOB 。_4 是_1 WP通過這個接口修改pattern參數可以做很多工作,比如:
分詞(pattern=ws):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國人。&pattern=ws&format=plain 我 是 中國 人 。?
詞性標注(pattern=pos):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國人。&pattern=pos&format=plain 我_r 是_v 中國_ns 人_n 。_wp?
命名實體識別(pattern=ner):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國人。&pattern=ner&format=plain 我 是 [中國]Ns 人 。?
語義依存分析(pattern=sdp):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國人。&pattern=sdp&format=plain 我_0 是_1 Exp 是_1 -1 Root 中國_2 人_3 Nmod 人_3 是_1 Clas 。_4 是_1 mPunc語義角色標注(pattern=srl):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國人。&pattern=srl&format=plain [我]A0 [是]v [中國 人]A1 。?
免費終究會有限制,無論是流量還是速度還是一次性分析文本大小,LTP平臺有有一定限制,這也是可以理解的,畢竟為大家開放了科研必備的資源和技術,成本也是需要控制的。
總結
以上是生活随笔為你收集整理的利用好手头的资源解决海量语料资源收集以及利用哈工大的LTP云平台解决依存句法和语义依存分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦想还是要有的,万一实现了呢
- 下一篇: Hadoop 生态学习