利用Python代碼實(shí)現(xiàn)中文文本的自然語(yǔ)言處理充择,包括分詞、去標(biāo)點(diǎn)符號(hào)匪蟀、去停用詞椎麦、詞性標(biāo)注&過(guò)濾。
在剛開始的每個(gè)模塊材彪,介紹它的實(shí)現(xiàn)观挎。最后會(huì)將整個(gè)文本處理過(guò)程封裝成 TextProcess 類。
頁(yè)面導(dǎo)航
結(jié)巴分詞
jieba 是比較好的中文分詞庫(kù)段化,在此之前嘁捷,需要 pip install jieba
結(jié)巴分詞有三種模式:
- 全模式 :把句子中所有的可以成詞的詞語(yǔ)都掃描出來(lái)
jieba.cut(text, cut_all=True)
- 精確模式 :將句子最精確地切開,適合文本分析
jieba.cut(text, cut_all=False) # 默認(rèn)模式
- 搜索引擎模式 :在精確模式的基礎(chǔ)上显熏,對(duì)長(zhǎng)詞再次切分雄嚣,適合用于搜索引擎分詞
jieba.cut_for_search(txt)
三種分詞效果如下圖所示:想要進(jìn)一步了解 jieba 三種模式,請(qǐng)參考 jieba分詞 喘蟆。因?yàn)槲乙龅氖俏谋痉治龌荷赃x用的是默認(rèn)的精確模式。
對(duì)于一些詞蕴轨,比如“吃雞”港谊,jieba 往往會(huì)將它們分成 “吃” 和 “雞” ,但是又不太想讓它們分開橙弱,這該怎么做呢歧寺?這時(shí)候就需要加載自定義的詞典 dict.txt燥狰。建立該文檔,在其中加入“吃雞”成福,執(zhí)行以下代碼:
file_userDict = 'dict.txt' # 自定義的詞典
jieba.load_userdict(file_userDict)
效果對(duì)比圖:
詞性標(biāo)注
在用 posseg 分詞后碾局,結(jié)果是一對(duì)值,包括 word 和 flag 奴艾,可以用 for 循環(huán)獲取。關(guān)于漢語(yǔ)詞性對(duì)照表内斯,請(qǐng)看 詞性標(biāo)注表
import jieba.posseg as pseg
sentence = "酒店就在海邊蕴潦,去鼓浪嶼很方便。"
words_pair = pseg.cut(sentence)
result = " ".join(["{0}/{1}".format(word, flag) for word, flag in words_pair])
print(result)
在此基礎(chǔ)上俘闯,可以進(jìn)一步做詞性過(guò)濾潭苞,只保留特定詞性的詞。首先在 tag_filter 表明想要留下哪些詞真朗,接著對(duì)于詞性標(biāo)注后的句子中的每一個(gè)詞此疹,如果詞性符合,則加入到 list 中遮婶。在這里只保留了名詞和動(dòng)詞蝗碎。
import jieba.posseg as pseg
list = []
sentence = "人們寧愿去關(guān)心一個(gè)蹩腳電影演員的吃喝拉撒和雞毛蒜皮,而不愿了解一個(gè)普通人波濤洶涌的內(nèi)心世界"
tag_filter = ['n', 'v'] # 需要保留的詞性
seg_result = pseg.cut(sentence) # 結(jié)果是一個(gè)pair旗扑,有flag和word兩種值
list.append([" ".join(s.word for s in seg_result if s.flag in tag_filter)])
print("詞性過(guò)濾完成")
print(list)
去停用詞
去停用詞時(shí)蹦骑,首先要用到停用詞表,常見的有哈工大停用詞表 && 百度停用詞表臀防。
在去停用詞之前眠菇,首先要通過(guò) load_stopword( ) 方法來(lái)加載停用詞列表,接著按照上文所示袱衷,加載自定義詞典捎废,對(duì)句子進(jìn)行分詞,然后判斷分詞后的句子中的每一個(gè)詞致燥,是否在停用詞表內(nèi)登疗,如果不在,就把它加入 outstr篡悟,用空格來(lái)區(qū)分 谜叹。
import jieba
# 加載停用詞列表
def load_stopword():
f_stop = open('hit_stopwords.txt', encoding='utf-8') # 自己的中文停用詞表
sw = [line.strip() for line in f_stop] # strip() 方法用于移除字符串頭尾指定的字符(默認(rèn)為空格)
f_stop.close()
return sw
# 中文分詞并且去停用詞
def seg_word(sentence):
file_userDict = 'dict.txt' # 自定義的詞典
jieba.load_userdict(file_userDict)
sentence_seged = jieba.cut(sentence.strip())
stopwords = load_stopword()
outstr = ''
for word in sentence_seged:
if word not in stopwords:
if word != '/t':
outstr += word
outstr += " "
print(outstr)
return outstr
if __name__ == '__main__':
sentence = "人們寧愿去關(guān)心一個(gè)蹩腳電影演員的吃喝拉撒和雞毛蒜皮,而不愿了解一個(gè)普通人波濤洶涌的內(nèi)心世界"
seg_word(sentence)
去標(biāo)點(diǎn)符號(hào)
導(dǎo)入 re 包搬葬,定義標(biāo)點(diǎn)符號(hào)荷腊,使用 sub( ) 方法將之替換。
import re
sentence = "+螞=蟻急凰!花!唄/期?免,息★.---《平凡的世界》:了*解一(#@)個(gè)“普通人”波濤洶涌的內(nèi)心世界女仰!"
sentenceClean = []
remove_chars = '[·’!"\#$%&\'()#2履辍()*+,-./:;<=>?\@,:?¥★疾忍、….>【】[]《》乔外?“”‘’\[\\]^_`{|}~]+'
string = re.sub(remove_chars, "", sentence)
sentenceClean.append(string)
print(sentence)
print(sentenceClean)