利用好手头的资源解决海量语料资源收集以及利用哈工大的LTP云平台解决依存句法和语义依存分析
一、利用好手頭的資源解決海量語(yǔ)料資源
基于語(yǔ)料做機(jī)器學(xué)習(xí)需要海量數(shù)據(jù)支撐,如何能不存一點(diǎn)數(shù)據(jù)獲取海量數(shù)據(jù)呢?我們可以以互聯(lián)網(wǎng)為強(qiáng)大的數(shù)據(jù)后盾,搜索引擎為我們提供了高效的數(shù)據(jù)獲取來(lái)源,結(jié)構(gòu)化的搜索結(jié)果展示為我們實(shí)現(xiàn)了天然的特征基礎(chǔ),唯一需要我們做的就是在海量結(jié)果中選出我們需要的數(shù)據(jù),本節(jié)我們來(lái)探索如何利用互聯(lián)網(wǎng)拿到我們所需的語(yǔ)料資源?
請(qǐng)尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明來(lái)源網(wǎng)站www.shareditor.com以及原始鏈接地址
關(guān)鍵詞提取
互聯(lián)網(wǎng)資源無(wú)窮無(wú)盡,如何獲取到我們所需的那部分語(yǔ)料庫(kù)呢?這需要我們給出特定的關(guān)鍵詞,而基于問(wèn)句的關(guān)鍵詞提取上一節(jié)已經(jīng)做了介紹,利用pynlpir庫(kù)可以非常方便地實(shí)現(xiàn)關(guān)鍵詞提取,比如:
# 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()提取出的關(guān)鍵詞如下:
電腦 2.0 垃圾 2.0 文件 2.0 刪除 1.0?
我們基于這四個(gè)關(guān)鍵詞來(lái)獲取互聯(lián)網(wǎng)的資源就可以得到我們所需要的語(yǔ)料信息
?
充分利用搜索引擎
有了關(guān)鍵詞,想獲取預(yù)料信息,還需要知道幾大搜索引擎的調(diào)用接口,首先我們來(lái)探索一下百度,百度的接口是這樣的:
https://www.baidu.com/s?wd=機(jī)器學(xué)習(xí) 數(shù)據(jù)挖掘 信息檢索
把wd參數(shù)換成我們的關(guān)鍵詞就可以拿到相應(yīng)的結(jié)果,我們用程序來(lái)嘗試一下:
首先創(chuàng)建scrapy工程,執(zhí)行:
scrapy startproject baidu_search自動(dòng)生成了baidu_search目錄和下面的文件(不知道怎么使用scrapy,請(qǐng)見(jiàn)我的文章教你成為全棧工程師(Full Stack Developer) 三十-十分鐘掌握最強(qiáng)大的python爬蟲(chóng))
創(chuàng)建baidu_search/baidu_search/spiders/baidu_search.py文件,內(nèi)容如下:
# 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=機(jī)器學(xué)習(xí)"]def parse(self, response):print response.body這樣我們的抓取器就做好了,進(jìn)入baidu_search/baidu_search/目錄,執(zhí)行:
scrapy crawl baidu_search我們發(fā)現(xiàn)返回的數(shù)據(jù)是空,下面我們修改配置來(lái)解決這個(gè)問(wèn)題,修改settings.py文件,把ROBOTSTXT_OBEY改為
ROBOTSTXT_OBEY = False并把USER_AGENT設(shè)置為:
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住,我們添加如下超時(shí)設(shè)置:
DOWNLOAD_TIMEOUT = 5再次執(zhí)行
scrapy crawl baidu_search這次終于可以看到大片大片的html了,我們臨時(shí)把他寫到文件中,修改parse()函數(shù)如下:
def parse(self, response):filename = "result.html"with open(filename, 'wb') as f:f.write(response.body)重新執(zhí)行后生成了result.html,我們用瀏覽器打開(kāi)本地文件如下:
說(shuō)明我們抓取到了正確的結(jié)果
?
語(yǔ)料提取
上面得到的僅是搜索結(jié)果,它只是一種索引,真正的內(nèi)容需要進(jìn)入到每一個(gè)鏈接才能拿到,下面我們嘗試提取出每一個(gè)鏈接并繼續(xù)抓取里面的內(nèi)容,那么如何提取鏈接呢,我們來(lái)分析一下result.html這個(gè)抓取百度搜索結(jié)果文件
?
我們可以看到,每一條鏈接都是嵌在class=c-container這個(gè)div里面的一個(gè)h3下的a標(biāo)簽的href屬性
請(qǐng)尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明來(lái)源網(wǎng)站www.shareditor.com以及原始鏈接地址
所以我們的提取規(guī)則就是:
hrefs = response.selector.xpath('//div[contains(@class, "c-container")]/h3/a/@href').extract()修改parse()函數(shù)并添加如下代碼:
hrefs = response.selector.xpath('//div[contains(@class, "c-container")]/h3/a/@href').extract()for href in hrefs:print href?
執(zhí)行打印出:
…… 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添加到抓取隊(duì)列中繼續(xù)抓取,修改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> ……看起來(lái)能夠正常抓取啦,下面我們把抓取下來(lái)的網(wǎng)頁(yè)提取出正文并盡量去掉標(biāo)簽,如下:
def parse_url(self, response):print remove_tags(response.selector.xpath('//body').extract()[0])?
下面,我們希望把百度搜索結(jié)果中的摘要也能夠保存下來(lái)作為我們語(yǔ)料的一部分,如下:
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)?
解釋一下,首先我們?cè)谔崛rl的時(shí)候順便把標(biāo)題和摘要都提取出來(lái),然后通過(guò)scrapy.Request的meta傳遞到處理函數(shù)parse_url中,這樣在抓取完成之后也能接到這兩個(gè)值,然后提取出content,這樣我們想要的數(shù)據(jù)就完整了:url、title、abstract、content
百度搜索數(shù)據(jù)幾乎是整個(gè)互聯(lián)網(wǎng)的鏡像,所以你想要得到的答案,我們的語(yǔ)料庫(kù)就是整個(gè)互聯(lián)網(wǎng),而我們完全借助于百度搜索引擎,不必提前存儲(chǔ)任何資料,互聯(lián)網(wǎng)真是偉大!
之后這些數(shù)據(jù)想保存在什么地方就看后面我們要怎么處理了,欲知后事如何,且聽(tīng)下面分解
二、利用哈工大的LTP云平臺(tái)解決依存句法和語(yǔ)義依存分析
句法分析是自然語(yǔ)言處理中非常重要的環(huán)節(jié),沒(méi)有句法分析是無(wú)法讓計(jì)算機(jī)理解語(yǔ)言的含義的,依存句法分析由法國(guó)語(yǔ)言學(xué)家在1959年提出,影響深遠(yuǎn),并且深受計(jì)算機(jī)行業(yè)青睞,依存句法分析也是做聊天機(jī)器人需要解決的最關(guān)鍵問(wèn)題之一,語(yǔ)義依存更是對(duì)句子更深層次的分析,當(dāng)然,有可用的工具我們就不重復(fù)造輪子,本節(jié)介紹如何利用國(guó)內(nèi)領(lǐng)先的中文語(yǔ)言技術(shù)平臺(tái)實(shí)現(xiàn)句法分析?
什么是依存句法分析呢?
叫的晦澀的術(shù)語(yǔ),往往其實(shí)灰常簡(jiǎn)單,句法就是句子的法律規(guī)則,也就是句子里成分都是按照什么法律規(guī)則組織在一起的。而依存句法就是這些成分之間有一種依賴關(guān)系。什么是依賴:沒(méi)有你的話,我存在就是個(gè)錯(cuò)誤。“北京是中國(guó)的首都”,如果沒(méi)有“首都”,那么“中國(guó)的”存在就是個(gè)錯(cuò)誤,因?yàn)椤氨本┦侵袊?guó)的”表達(dá)的完全是另外一個(gè)意思了。
?
什么是語(yǔ)義依存分析呢?
“語(yǔ)義”就是說(shuō)句子的含義,“張三昨天告訴李四一個(gè)秘密”,那么語(yǔ)義包括:誰(shuí)告訴李四秘密的?張三。張三告訴誰(shuí)一個(gè)秘密?李四。張三什么時(shí)候告訴的?昨天。張三告訴李四什么?秘密。
?
語(yǔ)義依存和依存句法的區(qū)別
依存句法強(qiáng)調(diào)介詞、助詞等的劃分作用,語(yǔ)義依存注重實(shí)詞之間的邏輯關(guān)系
另外,依存句法隨著字面詞語(yǔ)變化而不同,語(yǔ)義依存不同字面詞語(yǔ)可以表達(dá)同一個(gè)意思,句法結(jié)構(gòu)不同的句子語(yǔ)義關(guān)系可能相同。
?
依存句法分析和語(yǔ)義依存分析對(duì)我們的聊天機(jī)器人有什么意義呢?
依存句法分析和語(yǔ)義分析相結(jié)合使用,對(duì)對(duì)方說(shuō)的話進(jìn)行依存和語(yǔ)義分析后,一方面可以讓計(jì)算機(jī)理解句子的含義,從而匹配到最合適的回答,另外如果有已經(jīng)存在的依存、語(yǔ)義分析結(jié)果,還可以通過(guò)置信度匹配來(lái)實(shí)現(xiàn)聊天回答。
?
依存句法分析到底是怎么分析的呢?
依存句法分析的基本任務(wù)是確定句式的句法結(jié)構(gòu)(短語(yǔ)結(jié)構(gòu))或句子中詞匯之間的依存關(guān)系。依存句法分析最重要的兩棵樹(shù):
依存樹(shù):子節(jié)點(diǎn)依存于父節(jié)點(diǎn)
依存投射樹(shù):實(shí)線表示依存聯(lián)結(jié)關(guān)系,位置低的成分依存于位置高的成分,虛線為投射線
?
依存關(guān)系的五條公理
1. 一個(gè)句子中只有一個(gè)成分是獨(dú)立的
2. 其他成分直接依存于某一成分
3. 任何一個(gè)成分都不能依存于兩個(gè)或兩個(gè)以上的成分
4. 如果A成分直接依存于B成分,而C成分在句子中位于A和B之間,那么C或者直接依存于B,或者直接依存于A和B之間的某一成分
5. 中心成分左右兩面的其他成分相互不發(fā)生關(guān)系
?
什么地方存在依存關(guān)系呢?比如合成詞(如:國(guó)內(nèi))、短語(yǔ)(如:英雄聯(lián)盟)很多地方都是
?
LTP依存關(guān)系標(biāo)記
主謂關(guān)系 | SBV | subject-verb | 我送她一束花 (我 <-- 送) |
動(dòng)賓關(guān)系 | VOB | 直接賓語(yǔ),verb-object | 我送她一束花 (送 --> 花) |
間賓關(guān)系 | IOB | 間接賓語(yǔ),indirect-object | 我送她一束花 (送 --> 她) |
前置賓語(yǔ) | FOB | 前置賓語(yǔ),fronting-object | 他什么書(shū)都讀 (書(shū) <-- 讀) |
兼語(yǔ) | DBL | double | 他請(qǐng)我吃飯 (請(qǐng) --> 我) |
定中關(guān)系 | ATT | attribute | 紅蘋果 (紅 <-- 蘋果) |
狀中結(jié)構(gòu) | ADV | adverbial | 非常美麗 (非常 <-- 美麗) |
動(dòng)補(bǔ)結(jié)構(gòu) | CMP | complement | 做完了作業(yè) (做 --> 完) |
并列關(guān)系 | COO | coordinate | 大山和大海 (大山 --> 大海) |
介賓關(guān)系 | POB | preposition-object | 在貿(mào)易區(qū)內(nèi) (在 --> 內(nèi)) |
左附加關(guān)系 | LAD | left adjunct | 大山和大海 (和 <-- 大海) |
右附加關(guān)系 | RAD | right adjunct | 孩子們 (孩子 --> 們) |
獨(dú)立結(jié)構(gòu) | IS | independent structure | 兩個(gè)單句在結(jié)構(gòu)上彼此獨(dú)立 |
核心關(guān)系 | HED | head | 指整個(gè)句子的核心 |
請(qǐng)尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明來(lái)源網(wǎng)站www.shareditor.com以及原始鏈接地址
那么依存關(guān)系是怎么計(jì)算出來(lái)的呢?
是通過(guò)機(jī)器學(xué)習(xí)和人工標(biāo)注來(lái)完成的,機(jī)器學(xué)習(xí)依賴人工標(biāo)注,那么都哪些需要我們做人工標(biāo)注呢?分詞詞性、依存樹(shù)庫(kù)、語(yǔ)義角色都需要做人工標(biāo)注,有了這寫人工標(biāo)注之后,就可以做機(jī)器學(xué)習(xí)來(lái)分析新的句子的依存句法了
?
?
LTP云平臺(tái)怎么用?
首先注冊(cè)用戶,得到每月免費(fèi)20G的流量,在http://www.ltp-cloud.com/注冊(cè)一個(gè)賬號(hào),注冊(cè)好后登陸并進(jìn)入你的dashboard:http://www.ltp-cloud.com/dashboard/,可以看到自己唯一的api_key,我的保密,就不貼出來(lái)了,在dashboard里還可以查詢自己流量使用情況
具體使用方法如下(參考http://www.ltp-cloud.com/document):
curl -i "http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國(guó)人。&pattern=dp&format=plain"把這里的YourApiKey換成你自己的api_key,得到結(jié)果如下:
我_0 是_1 SBV 是_1 -1 HED 中國(guó)_2 人_3 ATT 人_3 是_1 VOB 。_4 是_1 WP通過(guò)這個(gè)接口修改pattern參數(shù)可以做很多工作,比如:
分詞(pattern=ws):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國(guó)人。&pattern=ws&format=plain 我 是 中國(guó) 人 。?
詞性標(biāo)注(pattern=pos):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國(guó)人。&pattern=pos&format=plain 我_r 是_v 中國(guó)_ns 人_n 。_wp?
命名實(shí)體識(shí)別(pattern=ner):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國(guó)人。&pattern=ner&format=plain 我 是 [中國(guó)]Ns 人 。?
語(yǔ)義依存分析(pattern=sdp):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國(guó)人。&pattern=sdp&format=plain 我_0 是_1 Exp 是_1 -1 Root 中國(guó)_2 人_3 Nmod 人_3 是_1 Clas 。_4 是_1 mPunc語(yǔ)義角色標(biāo)注(pattern=srl):
GET http://api.ltp-cloud.com/analysis/?api_key=YourApiKey&text=我是中國(guó)人。&pattern=srl&format=plain [我]A0 [是]v [中國(guó) 人]A1 。?
免費(fèi)終究會(huì)有限制,無(wú)論是流量還是速度還是一次性分析文本大小,LTP平臺(tái)有有一定限制,這也是可以理解的,畢竟為大家開(kāi)放了科研必備的資源和技術(shù),成本也是需要控制的。
總結(jié)
以上是生活随笔為你收集整理的利用好手头的资源解决海量语料资源收集以及利用哈工大的LTP云平台解决依存句法和语义依存分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦想还是要有的,万一实现了呢
- 下一篇: Hadoop 生态学习