自然語言處理的資料預處理過程主要包括如下步驟:
(1)文字資料集的劃分(訓練集、驗證集和測試集);
(2)文字資料的匯入;
(3)分詞;
(4)詞彙表的構建;
(5)文字資料對於詞彙表的編碼和對映;
(6)詞向量的生成;
(7)批文本資料的生成。
torchtext是乙個高效、有力的文字預處理庫(其對nlp的作用類似於torchvision之於cv),提供了涵蓋上述諸步驟的一站式文字預處理功能。其預處理結果不僅可用於pytorch,也可用於其他框架的使用。
torchtext的整體處理流程如上圖所示,其主要的類物件包括:
(1)dataset, 作用類似於torch.utils.data.dataset
,提供了完整的資料載入和切片功能;
(2)example,為dataset的乙個文字資料,其可有text和對應的label構成;
(3)field,定義了文字處理的配置資訊;
(4)vocab,記錄了文字中涉及的詞彙表單
(5)vector,詞向量
(6)iterator,作用類似於torch.unitls.data.dataloader
,為乙個迭代器,每次迭代記錄了乙個batch的文字資料
(7)pipeline,將各子功能模組進行連線的管道工具。
用torchtext來處理文字的的一般流程歸納如下:
(1)定義field
物件,配置文字處理(包括text和label)的分詞、停用詞、文字長度、填充詞、未知詞等一系列工具;
(2)定義datasets
物件,載入原始語料(字串資料),利用引數fields
設定相關預處理工具,並利用splits
實現各資料集的劃分,劃分結果中為乙個個的example
物件;
(3)利用field.build_vocab
建立詞彙表物件vocab
;
(4)定義iteator
物件,實現對datasets
物件的封裝,返回可迭代的批量化文字向量資料,供下游nlp任務使用。
下面通過乙個例子,來簡單實踐下上述的基本流程:
步驟一:準備好合適的原始語料
這裡通過將文字存為csv格式,方便後續的處理。csv主要包括兩個字段,texts為文字,label為文字分類。對於不同的nlp任務,需要定義不同的字段和原始語料格式。
import pandas as pd
defraw_corpus()
:# 進行一些語料的清洗和預處理工作
corpus = pd.dataframe(
) corpus.to_csv(
'corpus.csv'
, index=
false
, sep=
'\t'
)# 注意這裡的sep符號,後面要用到
步驟二:定義分詞工具、停用詞等,然後配置field物件,進行資料集的劃分和詞彙表生成
from torch.text import data
import jieba
# 定義分詞工具
deftokenizer
(text)
:return
[wd for wd in jieba.cut(text, cut_all=
false)]
# 定義停用詞表
stopwords =
open
('stopwords'
, encoding=
'utf-8'
).read(
).strip(
).split(
'\n'
)# 定義text和label的field物件,相關引數說明見下
text = data.field(sequential=
true
, use_vocab=
true
, fix_length=
20, tokenize=tokenizer, stop_words=stopwords, batch_first=
true
)label = data.field(sequential=
false
, use_vocab=
false
)# 劃分資料集,相關引數說明見下
train, val = data.tabulardataset.splits(
path=
'./data'
, train=
'train_corpus.csv'
,validation=
'valid_corpus.csv'
,format
='csv'
, skip_header=
true
, csv_reader_params=
,fields =[(
'text'
,text),(
'label'
,label)])
# 根據訓練資料,生成詞彙表
text.build_vocab(train)
上面用到了兩個重要物件field
和tabulardataset
,field
物件前文已提及用於定義文字預處理的配置,可將語料一站式生成張量;而tabulardataset
是前文dataset
物件的子類,專門用於處理**型別原始語料(如json、csv和tsv)的載入。下面分別進行介紹:
1)field
物件,其主要引數配置包括:
field物件可實現如下重要方法:
2)tabulardataset
物件,其利用splits
函式進行語料的劃分和field
處理,主要引數配置包括:
步驟三:建立資料迭代器iterator,並通過splits函式進行劃分
train_iter, val_iter = data.iterator.splits(
(train, val)
, batch_sizes=(10
,5), device=
"cuda"
, sort_key=
lambda x:
len(x.text)
,sort_within_batch=
false
, repeat=
false
)
其中的重要引數設定包括:
步驟四:將各batch資料匯入下游任務中
for epoch in
range(3
):for batch in train_iter:
feature, target = batch.text, batch.label # 這裡的text和label即為tabulardataset.splits中feild引數裡的別名
# 後續任務
由上可見,torchtext可以提高文字資料預處理的效率和封裝性,值得一試。
【reference】
官方手冊
原始碼torchtext入門教程
UICollectionView的簡單使用
所屬controller要遵循三個協議 uicollectionviewdatasource,uicollectionviewdelegate,uicollectionviewdelegateflowlayout uicollectionviewflowlayout flowlayout uicol...
BGAQRCode Android的簡單使用
compile com.google.zxing core 3.2.1 xmlns android 這句是使用選擇器框架時用到的 xmlns tools package com.huaqiang.zxingdemo 選擇框架用到 android name android.permission.cam...
Android VideoView的簡單使用
mvideoview.setvideouri uri.parse android.resource getpackagename r.raw play 設定乙個 控制器 控制器預設在父布局的地步 可以自己實現控制器布局 mvideoview.setmediacontroller new mediac...