自然语言处理-中文语料预处理
自然語言處理——中文文本預(yù)處理
近期,在自學(xué)自然語言處理,初次接觸NLP覺得十分的難,各種概念和算法,而且也沒有很強(qiáng)的編程基礎(chǔ),學(xué)著稍微有點(diǎn)吃力。不過經(jīng)過兩個(gè)星期的學(xué)習(xí),已經(jīng)掌握了一些簡單的中文、英文語料的預(yù)處理操作。寫點(diǎn)筆記,記錄一下學(xué)習(xí)的過程。
1、中文語料的特點(diǎn)
第一點(diǎn):中文語料中詞與詞之間是緊密相連的,這一點(diǎn)不同與英文或者其它語種的語料,因此在分詞的時(shí)候不能像英文使用空格分詞,可以jieba庫進(jìn)行分詞。第二點(diǎn):編碼問題,中文語料的編碼格式是unicode,而不是utf-8編碼格式。這里介紹utf-8編碼和unicode編碼讀取的區(qū)別,unicode 一個(gè)中文字符占2個(gè)字節(jié),而UTF-8一個(gè)中文字符占3個(gè)字節(jié),因此如果不注意編碼問題,在處理過程中肯定會(huì)出錯(cuò)的。
2、中文語料預(yù)處理
本次我做的中文語料預(yù)處理包含了以下操作:數(shù)據(jù)導(dǎo)入、數(shù)據(jù)清洗、中文分詞、去停用詞、特征處理(TF-IDF權(quán)重計(jì)算)。下面我將模塊介紹我的處理過程。
2.1 數(shù)據(jù)導(dǎo)入
首先,先準(zhǔn)備好本次要使用的數(shù)據(jù)集,一段摘自騰訊體育新聞中新聞報(bào)道,文本保存格式設(shè)置為utf-8。然后倒入進(jìn)python,使用到open函數(shù)讀取文件,讀取格式選擇‘r'表示讀取文件,編碼encoding = ’utf-8',查看文件中的內(nèi)容用read函數(shù)。具體編碼如下:
#文件讀取
def read_txt (filepath):
file = open(filepath,'r',encoding='utf-8')
txt = file.read()
return txt
讀取結(jié)果展示:
(注意:返回的txt是str類型的,即字符串類型,不需要decode。str與bytes表示的是兩種數(shù)據(jù)類型,str為字符串型,bytes為字節(jié)型。對str編碼encode得到bytes,對bytes解碼decode得到str)
2.2 數(shù)據(jù)清洗
新聞文本數(shù)據(jù)中不僅包括了中文字符,還包括了數(shù)字、英文字符、標(biāo)點(diǎn)等非常規(guī)字符,這些都是無意義,并且需要處理的數(shù)據(jù)。清洗的方法使用的是正則表達(dá)式,匹配規(guī)則為:[u4e00-u9fa5],un匹配n,其中n是一個(gè)用四個(gè)十六進(jìn)制數(shù)字表示的Unicode字符,而4e00-9fa5之間的Unicode編碼表示的是20000多個(gè)中文字符。具體編碼如下:
#匹配[^u4e00-u9fa5]
def find_chinese (file):
pattern = re.compile(r'[^u4e00-u9fa5]')
chinese_txt = re.sub(pattern,'',file)
return chinese_txt
解釋:[u4e00-u9fa5]表示匹配漢字,[^u4e00-u9fa5]表示匹配除漢字以外的所有字符。
數(shù)據(jù)展示:
2.3 中文分詞
分詞是中文文本分析的重要內(nèi)容,正確的分詞可以幫助我們更好的構(gòu)建模型、運(yùn)用算法分析。中文分詞一般使用jieba庫中的cut方法,cut方法分詞有兩種模式,一種為全模式,另一種為精準(zhǔn)模式,相較于全模式,精準(zhǔn)模式分詞更加精準(zhǔn)可靠,因此選用精準(zhǔn)模式對文本分詞。注:精準(zhǔn)模式和全模式的區(qū)別在于是否cut_all,精準(zhǔn)模式選擇cut_all= False;全模式選擇cut_all= True。Jieba庫的安裝十分簡單,只需要在命令框中輸入:pip install jieba 即可安裝。
import jieba
txt = '''
騰訊體育3月6日訊 史蒂芬-庫里時(shí)隔127天后復(fù)出,勇士113-121不敵猛龍。猛龍本場比賽過后,取得44勝18負(fù)戰(zhàn)績,鎖定季后賽,成為本賽季聯(lián)盟第2支鎖定季后賽的球隊(duì),第1支是雄鹿。
比賽開始后,庫里持球組織進(jìn)攻,明顯改變了猛龍的防守,給克里斯和維金斯創(chuàng)造了輕松得分的機(jī)會(huì)。但在第一節(jié)還剩6分11秒下場時(shí),庫里沒有得分,2次三分出手全部偏出。
但在第二節(jié)比賽重新登場后,我們看到了那個(gè)熟悉的庫里。他接球投三分命中,迎著防守人超遠(yuǎn)壓哨三分命中,第三節(jié)還迎著洛瑞完成3+1。那個(gè)三分之王和2次常規(guī)賽MVP風(fēng)采依舊。
勇士將士就像打不死的小強(qiáng),從第一節(jié)開始就非常頑強(qiáng),緊緊的咬住比分,甚至伺機(jī)反撲。'''
#全模式
jieba_list = jieba.cut(txt,cut_all=True)
jieba_txt1 = ' '.join(jieba_list)
print('全模式分詞:',jieba_txt1)
#精準(zhǔn)模式
jieba_list = jieba.cut(txt, cut_all=False)
jieba_txt2 = ' ' .join(jieba_list)
print('精準(zhǔn)模式分詞:',jieba_txt2)
通過這段代碼我們可以體會(huì)一下全模式分詞和精準(zhǔn)模式分詞的區(qū)別。
需要注意的一點(diǎn)是jieba分詞后返回的數(shù)據(jù)類型是generator類型,是一個(gè)迭代器,需要使用for循環(huán)才能讀取其中的內(nèi)容。
處理的算法:
#中文分詞
def cut_word(text):
# 精準(zhǔn)模式
jieba_list = jieba.cut(text, cut_all=False)
return jieba_txt
分詞結(jié)果:
2.4 停用詞去除
無論是中文中,還是英文中,都有用來起連接作用的連詞、虛詞、語氣詞等無意義的詞,這些詞沒有具體的含義,只是起著銜接句子的作用。這些詞對文本分析沒有任何幫助,因此我們還需要對分詞后的數(shù)據(jù)做停用詞處理。進(jìn)行停用詞處理需要停用詞表,本文中選用的停用詞表為哈工大的停用詞表,因?yàn)樵趪鴥?nèi)研究自然語言處理他們屬于翹楚。
停用詞表在我的博客中有分享,有需要的可以自行下載。具體代碼如下:
#去除停用詞
def seg_sentence(list_txt):
#讀取停用詞表
stopwords = stopwords = read_txt('哈工大停用詞表.txt')
seg_txt = [ w for w in list_txt if w not in stopwords]
return seg_txt
去停用詞結(jié)果:
2.5 詞頻統(tǒng)計(jì)
統(tǒng)計(jì)分詞后文本的詞頻,目的是找出對文本影響最重要的詞匯,統(tǒng)計(jì)這些詞的頻率可以幫助我們了解文章重點(diǎn)強(qiáng)調(diào)了什么,以及方便后續(xù)構(gòu)建模型。詞頻統(tǒng)計(jì)中使用了python自帶的collections庫中的counter接口,它可以幫助統(tǒng)計(jì)詞頻率。Collection安裝方法:pip install collections。具體代碼:
#詞頻統(tǒng)計(jì)
def counter(txt):
seg_list = txt
c = Counter()
for w in seg_list:
if w is not ' ':
c[w] += 1
return c
統(tǒng)計(jì)結(jié)果如下所示:
2.6 特征選擇—TF-IDF權(quán)重計(jì)算
TF-IDF權(quán)重是很可靠的權(quán)重表征方式,用以評估一字詞對于一個(gè)文件集或一個(gè)語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時(shí)會(huì)隨著它在語料庫中出現(xiàn)的頻率成反比下降。TF-IDF加權(quán)的各種形式常被搜索引擎應(yīng)用,作為文件與用戶查詢之間相關(guān)程度的度量或評級。代碼:
#TF_IDF計(jì)算
def tf_idf(txt):
corpus_txt = [' '.join(txt)]
stopword_list = read_txt(r'哈工大停用詞表.txt').splitlines()
vector = TfidfVectorizer(stop_words=stopword_list)
tfidf = vector.fit_transform(corpus_txt)
print(tfidf)
# 獲取詞袋模型中的所有詞
wordlist = vector.get_feature_names()
# tf-idf矩陣 元素a[i][j]表示j詞在i類文本中的tf-idf權(quán)重
weightlist = tfidf.toarray()
# 打印每類文本的tf-idf詞語權(quán)重,第一個(gè)for遍歷所有文本,第二個(gè)for便利某一類文本下的詞語權(quán)重
for i in range(len(weightlist)):
print("-------第", i, "段文本的詞語tf-idf權(quán)重------")
for j in range(len(wordlist)):
print(wordlist[j], weightlist[i][j] )
運(yùn)行結(jié)果:
2.7 總結(jié)
到此中文文本的預(yù)處理就結(jié)束了。暫時(shí)這兩個(gè)星期學(xué)到的預(yù)處理就這么多,如有不當(dāng)之處,還忘大佬能不吝指導(dǎo)。最后附上全部代碼:
import nltk
import jieba
import re
from collections import Counter
from sklearn.feature_extraction.text import TfidfVectorizer
#創(chuàng)建去除非中文字符的函數(shù)
#數(shù)據(jù)清洗,去除標(biāo)點(diǎn)符號(hào),數(shù)字,等其它非中文字符
#匹配[^u4e00-u9fa5]
def find_chinese (file):
pattern = re.compile(r'[^u4e00-u9fa5]')
chinese_txt = re.sub(pattern,'',file)
return chinese_txt
#文件讀取
def read_txt (filepath):
file = open(filepath,'r',encoding='utf-8')
txt = file.read()
return txt
#中文分詞
def cut_word(text):
# 精準(zhǔn)模式
jieba_list = jieba.cut(text, cut_all=False)
return jieba_list
#去除停用詞
def seg_sentence(list_txt):
#讀取停用詞表
stopwords = stopwords = read_txt('哈工大停用詞表.txt')
seg_txt = [ w for w in list_txt if w not in stopwords]
return seg_txt
#詞頻統(tǒng)計(jì)
def counter(txt):
seg_list = txt
c = Counter()
for w in seg_list:
if w is not ' ':
c[w] += 1
return c
#TF_IDF計(jì)算
def tf_idf(txt):
corpus_txt = [' '.join(txt)]
stopword_list = read_txt(r'哈工大停用詞表.txt').splitlines()
vector = TfidfVectorizer(stop_words=stopword_list)
tfidf = vector.fit_transform(corpus_txt)
print(tfidf)
# 獲取詞袋模型中的所有詞
wordlist = vector.get_feature_names()
# tf-idf矩陣 元素a[i][j]表示j詞在i類文本中的tf-idf權(quán)重
weightlist = tfidf.toarray()
# 打印每類文本的tf-idf詞語權(quán)重,第一個(gè)for遍歷所有文本,第二個(gè)for便利某一類文本下的詞語權(quán)重
for i in range(len(weightlist)):
print("-------第", i, "段文本的詞語tf-idf權(quán)重------")
for j in range(len(wordlist)):
print(wordlist[j], weightlist[i][j] )
#主函數(shù)
if __name__ == "__main__":
#讀取文本信息
news = read_txt('新聞(中文).txt')
print("原文:",news)
#清洗數(shù)據(jù),去除無關(guān)標(biāo)點(diǎn)
chinese_news = find_chinese(news)
print("原文文本:",news)
print("純中文文本:",chinese_news)
#結(jié)巴分詞
chinese_cut = cut_word(chinese_news)
print(chinese_cut)
# 停用詞去除
chinese_sentence = seg_sentence(chinese_cut)
print(chinese_sentence)
#詞頻統(tǒng)計(jì)
lists = counter(chinese_sentence)
print(lists)
for list in lists.most_common(20):
print(list)
#TF-IDF權(quán)重計(jì)算
tf_idf(chinese_sentence)
總結(jié)
以上是生活随笔為你收集整理的自然语言处理-中文语料预处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾达无线路由器怎么设置-腾达如何设置路由
- 下一篇: 毕业论文格式检查指南与内容要求