本帖是對(印度)Jalaj Thanaki作品《python自然語言處理》張金超、劉舒曼譯本的縮減及改編~

不同檔案格式的語料

語料有不同的格式。在實踐中,我們可以使用下面的檔案格式。所有的這些檔案格式一般都用來儲存特徵,並在之後用作機器學習演算法的輸入:

txt:這種格式僅提供一個原始資料集 ,gutenberg資料集就是這種語料庫的例項之一一些實際的應用包含了對平行語料庫的使用。例如,如果想要開發類似 Grammarly的語法校正軟體,就需要使用平行語料庫。

csv:在參加程式設計馬拉松或 Kaggle比賽時,通常會提供這種檔案格式的語料。我們使用這種檔案格式儲存從原始文字中提取的特徵,而包含特徵的csv檔案將用來訓練NLP應用的演算法。

tsv:當你需要構建一個在句子中

新增逗號

的NLP應用時,csv檔案無法用來儲存相關的特徵,因為特徵本身包含了逗號,這將影響我們對於特徵檔案的處理。這時,你可以使用

任何自定義的分隔符

,如\t、‖或其他符號,以便於後續的處理。

xml:一些著名的NLP分析器和工具提供xml格式的結果。如 Stanford的 CoreNLP工具提供了xml格式的句法分析結果。這種檔案格式主要用於儲存NLP應用的結果。

json:Stanford CoreNLP工具也提供json格式的結果。這種檔案格式主要用於儲存NLP應用的結果,同時,它

十分便於顯示

,也易於

同網頁應用相整合。

LibSvM:特殊的檔案格式。

支援稀疏訓練資料,這種格式的訓練資料中僅包含非零值。其中的索引代表原有格式中一條例項資料的一個數值所在的列(也可理解為特徵編號)。如果要從傳統資料集轉化為 LibSVM格式,只需要遍歷原有格式資料,如果原資料集構成的稀疏矩陣中X(i,j)的數值非零,在 LibSVM格式資料中輸出j+1:X(i,j)即可。

X(i,j)即原稀疏矩陣:

■如果(i,j)的數值非零,那麼這個值應該被記錄在 LibSVM格式檔案裡。

◆ LibsVM的j+1索引後對應的是原X(i,j)的值,由於矩陣的列索引是從0開始的,所以這裡我們為每一個j加1。

■否則,這個值無須記錄在檔案中。

舉例如下:

■1 5:1 7:1 14:1 19:1

◆1代表該例項的類別,或者說標籤。

◆在5:1中,5是鍵值,1則是數值,即5:1是一對鍵值對。

◆其中,5是這一例項向量的列序號,也可以理解為資料的屬性編號;由於這裡我們只考慮稀疏矩陣中的非零值,因此5所對應的值是1。

◆這個例項變數的1,2,3,4,6列,以及其他沒有提到的列對應的數值都是0,因此在對應的 LibsVM格式中這些列數不被記錄在內。

Apache Spark使用這種資料型別進行訓練,在第5章中介紹了將文字資料轉化成 LibsVM格式的方法

免費語料庫資源

獲取語料是一個富有挑戰性的工作,本節提供了一些可以免費獲取的用於NLP應用的語料資源連結。

nltk庫包含了一些內建語料庫。執行下面的指令將輸出所有語料庫的名字:

import nltk。corpus

dir(nltk。corpus)

print(dir(nltk。corpus))

如果你希望獲得更多的語料庫資源,可以參考 Bernard Marr的文章:《

Big Data: 33 Brilliant And Free Data Sources Anyone Can Use

https://www。

forbes。com/sites/bernar

dmarr/2016/02/12/big-data-35-brilliant-and-free-data-sources-for-2016/#670690eeb54d

目前為止,本章已講述了很多基礎內容。下一節將告訴你如何為一個基於機器學習的自然語言處理應用進行資料集的準備。

為NLP應用準備資料集

本節將講述為NLP或其他資料科學應用準備資料集的基本步驟。三個基本步驟如下:

挑選資料

預處理資料

轉換資料

挑選資料

如果你正同世界科技巨頭,如谷歌、蘋果、臉書等合作,那麼你可以輕易地獲取大量資料,但如果你沒有有力的合作伙伴,而是進行獨立研究或學習,那麼要如何、從哪裡獲取資料集?首先,根據你想要開發的NLP應用,決定所需資料集的種類。此外,你還需要徹底地理解應用和問題陳述,確定應用的最終輸出。

注意:你可以使用下面的連結下載免費資料集:

https://

github。com/awesomedata/

awesome-public-datasets

https://www。

kaggle。com/datasets

https://www。

reddit。com/r/datasets/

你也可以使用谷歌的高階搜尋功能,或者使用 Python網路爬蟲庫,如 beautifulsoup或 scrapy來獲取資料。

預處理資料集

1。格式化

在本階段,生成最便於你的工作的資料集格式。如果你的資料集是JSON格式的,但csv將更便捷,那麼就將它從JSON轉化為CSV格式。

2。清洗

如果資料集存在缺失值,可以考慮刪除這條記錄,或者使用合適的近似值來填充。如果資料集中存在不必要的資料屬性,也可以將它移除。假設你正在構建一個語法校正系統,那麼可以從資料集中移除數學公式,因為應用中無須使用

公式

3。取樣

這一階段中,我們實際上在嘗試理清資料集中可以獲得和匯出的資料屬性,並根據

應用辨別哪些屬性更重要

。假如我們正構建一個聊天機器人,那麼,需要將

句子切分成詞,然後辨別其中的關鍵詞,因此,需要從中匯出詞級別的資訊

。對這個應用而言,詞級別和句子級別的資訊都很重要,所以除了垃圾資料以外,不對資料進行刪除。透過

取樣,我們可以抽取出能夠最好地表達整個資料集的資料屬性。

4。轉換資料

在這一階段,我們應用一些特徵工程技術,將文字資料轉化成為數值資料,以便機器理解和找出其中的規律。所以本階段實質上是資料處理階段。在NLP領域,可以透過一些

編碼和向量化

技術進行這樣的轉換。

2。8網頁爬取

將使 beautifulsoup和 scrapy等庫開發網路爬蟲工具,並學習相應的基本程式碼。

下面的連結包含了 beautifulsoup和scrapy的安裝指南 scrapy :

https://

github。com/jalajthanaki

/NLPython/blob/master/ch2/Chapter_2_Installation_Commands。txt

程式碼示例:

import requests

from bs4 import BeautifulSoup

def getPagebyBeau():

page=requests。get(“https://simplifydatascience。wordpress。com/about/”)

soup=BeautifulSoup(page。content,“lxml”)

print(soup。find_all(‘p’)[0]。get_text())

print(soup。find_all(‘p’)[1]。get_text())

print(soup。find_all(‘p’)[2]。get_text())

print(soup。find_all(‘p’)[3]。get_text())

getPagebyBeau()

output:

simplify data science

SDS

I’m data science researcher by practice and data scientist by profession。 I like to deal with data science related problems。 My research interest lies into Big Data Analytics , Natural Language Processing , Machine Learning and Deep Learning。

I am still learning myself, but I found that writing posts and tutorials is the best way to deepen my own understanding and knowledge。 On this platform, I’m sharing my experiences and also coming up with tutorials for beginners and posting articles。 I am happy to help in any way I can。 So don’t hesitate to get in touch!

如果在執行指令碼的過程中產生了警報,不用擔心。

現在,再嘗試使用 scrapy庫進行網頁爬取。首先,需要建立一個新的 scrapy專案。

在終端執行下面的命令建立一個 scrapy專案:

scrapy startproject project_name

我使用的 scrapy專案名稱是 web_scraping_test,命令如下:

scrapy startproject web_scraping_test

之後,執行下列步驟:

1)編輯items。py檔案,這個檔案在建立專案時已經建立了。

2)在spiders目錄下新建 WebScrapingTestspider檔案。

3)前往想要爬取的網頁,並選取需要的元素的 xpath。你可以在這個網址瞭解更多有關 xpath選取的內容 :

https://

doc。scrapy。org/en/1。0/t

opics/selectors。html

使用Scrapy構建基本網路爬蟲的部分程式碼(全部程式碼:

https://

github。com/jalajthanaki

/NLPython/tree/master/web_scraping_test/web_scraping_test

from scrapy import Spider

from scrapy。selector import Selector

class WebScrapingTestspider(Spider):

name = “WebScrapingTestspider”

allowed_domains = [“stackoverflow。com”]

start_urls = [

“http://stackoverflow。com/questions?pagesize=50&sort=newest”,

def parse(self, response):

questions = Selector(response)。xpath(‘//div[@class=“summary”]/h3’)

for question in questions:

item = dict()

item[‘title’] = question。xpath(

‘a[@class=“question-hyperlink”]/text()’)。extract()[0]

item[‘url’] = question。xpath(

‘a[@class=“question-hyperlink”]/@href’)。extract()[0]

yield item

如果產生了任何SSL相關的警告,你可以在這個連結找到答案:

https://

stackoverflow。com/quest

ions/29134512/insecureplatformwarning-a-true-sslcontext-object-is-not-available-this-prevent

你也可以開發一個繞過AJAX和指令碼的網路爬蟲,但需要非常小心,遵守道德。本書將不介紹此種方法。出於好奇,你也可以上網搜尋他人是如何做到的。你可以

透過 Selenium庫進行自動點選來模擬網路事件。