中文文本預(yù)處理流程(帶你分析每一步)

標(biāo)簽:中文文本預(yù)處理
作者:煉己者


本博客所有內(nèi)容以學(xué)習(xí)摊灭、研究和分享為主咆贬,如需轉(zhuǎn)載,請聯(lián)系本人帚呼,標(biāo)明作者和出處掏缎,并且是非商業(yè)用途皱蹦,謝謝!


摘要

  • 機(jī)器學(xué)習(xí)我的理解就是把各種原始的東西變成機(jī)器可以理解的東西眷蜈,然后再用各種機(jī)器學(xué)習(xí)算法來做操作沪哺。機(jī)器可以理解的東西是什么呢?——向量 酌儒。所以不管是圖片還是文字辜妓,要用機(jī)器學(xué)習(xí)算法對它們進(jìn)行處理,就要把它們轉(zhuǎn)為向量忌怎。
  • 網(wǎng)上大部分都是處理英文文本的資料籍滴,本文就以中文文本為例,將原始的文本經(jīng)過預(yù)處理得到文本向量

目錄

  • 去除指定無用的符號(hào)
  • 讓文本只保留漢字
  • 對文本進(jìn)行jieba分詞
  • 去除停用詞
  • 將文本轉(zhuǎn)為tfidf向量并輸入到算法中

操作流程

1.去除指定無用的符號(hào)

我們拿到的文本有時(shí)候很有很多空格榴啸,或者你不想要的符號(hào)孽惰,那么你就可以用這個(gè)方法去掉所有你不想要的符號(hào)。在這里我以空格為例

content = ['  歡迎來到  煉己者的博客','煉己者     帶你入門NLP  ']
# 去掉文本中的空格
def process(our_data):
    m1 = map(lambda s: s.replace(' ', ''), our_data)
    return list(m1)
print(process(content))

傳入的參數(shù)our_data是個(gè)列表鸥印,此函數(shù)可以把文本中的所有空格全部去掉勋功。看一下輸出的結(jié)果库说】裥可以發(fā)現(xiàn),所有的空格都被刪掉了

['歡迎來到煉己者的博客', '煉己者帶你入門NLP']

2.讓文本只保留漢字

這個(gè)操作我最喜歡潜的,他可以去掉所有的符號(hào)骚揍,包括數(shù)字、標(biāo)點(diǎn)夏块、字母等等

content = ['如果這篇文章對你有所幫助,那就點(diǎn)個(gè)贊唄O说АF旯!','如果想聯(lián)系煉己者的話借跪,那就打電話:110U骸!掏愁!','想學(xué)習(xí)NLP歇由,那就來關(guān)注呀!^-^']
# 讓文本只保留漢字
def is_chinese(uchar):
    if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
        return True
    else:
        return False

def format_str(content):
    content_str = ''
    for i in content:
        if is_chinese(i):
            content_str = content_str + i
    return content_str

# 參函數(shù)傳入的是每一句話
chinese_list = []
for line in content:
    chinese_list.append(format_str(line))
print(chinese_list)

然后我們來看一下輸出的內(nèi)容果港,你會(huì)發(fā)現(xiàn)只剩下中文了沦泌。這個(gè)操作實(shí)在太騷了

['如果這篇文章對你有所幫助那就點(diǎn)個(gè)贊唄', '如果想聯(lián)系煉己者的話那就打電話', '想學(xué)習(xí)那就來關(guān)注呀']

3. 對文本進(jìn)行jieba分詞

首先你得下載jieba這個(gè)庫,直接pip install jieba即可辛掠。
我們就以上面處理好的那句話作為例子來操作

chinese_list = ['如果這篇文章對你有所幫助那就點(diǎn)個(gè)贊唄', '如果想聯(lián)系煉己者的話那就打電話', '想學(xué)習(xí)那就來關(guān)注呀']

# 對文本進(jìn)行jieba分詞
import jieba
def fenci(datas):
    cut_words = map(lambda s: list(jieba.cut(s)), datas)
    return list(cut_words)

print(fenci(chinese_list))

然后你就可以得到分詞的結(jié)果了

[['如果', '這', '篇文章', '對', '你', '有所', '幫助', '那', '就', '點(diǎn)個(gè)', '贊', '唄'],
 ['如果', '想', '聯(lián)系', '煉己', '者', '的話', '那', '就', '打電話'],
 ['想', '學(xué)習(xí)', '那', '就', '來', '關(guān)注', '呀']]

4.去除停用詞

首先你得上網(wǎng)下載一個(gè)停用詞表谢谦,也可以關(guān)注我的微信公眾號(hào)
ZhangyhPico释牺,回復(fù)停用詞表,就可以拿到了回挽。然后把這份停用詞轉(zhuǎn)換為列表
為了方便大家理解没咙,在這里我就假設(shè)一個(gè)停用詞表了,我們以上面分好詞的數(shù)據(jù)為例

# 分好詞的數(shù)據(jù)
fenci_list = [['如果', '這', '篇文章', '對', '你', '有所', '幫助', '那', '就', '點(diǎn)個(gè)', '贊', '唄'],
 ['如果', '想', '聯(lián)系', '煉己', '者', '的話', '那', '就', '打電話'],
 ['想', '學(xué)習(xí)', '那', '就', '來', '關(guān)注', '呀']]

# 停用詞表
stopwords = ['的','呀','這','那','就','的話','如果']

# 去掉文本中的停用詞
def drop_stopwords(contents, stopwords):
    contents_clean = []
    for line in contents:
        line_clean = []
        for word in line:
            if word in stopwords:
                continue
            line_clean.append(word)
        contents_clean.append(line_clean)
    return contents_clean

print(drop_stopwords(fenci_list,stopwords))

我們來一下結(jié)果,對比發(fā)現(xiàn)少了一些停用詞

[['篇文章', '對', '你', '有所', '幫助', '點(diǎn)個(gè)', '贊', '唄'],
 ['想', '聯(lián)系', '煉己', '者', '打電話'],
 ['想', '學(xué)習(xí)', '來', '關(guān)注']]

我覺得上面的操作也可應(yīng)用在去除一些你不想要的符號(hào)上面千劈,你可以把沒有用的符號(hào)添加到停用詞表里祭刚,那么它也會(huì)被去掉

5.將文本轉(zhuǎn)為tfidf向量并輸入到算法中

最后這一步你可以參照這篇文章操作,使用不同的方法計(jì)算TF-IDF值
不過為了完整起見墙牌,我在這里給大家再演示一遍操作流程涡驮。咱們就以上面去掉停用詞的數(shù)據(jù)為例

word_list = [['篇文章', '對', '你', '有所', '幫助', '點(diǎn)個(gè)', '贊', '唄'],
 ['想', '聯(lián)系', '煉己', '者', '打電話'],
 ['想', '學(xué)習(xí)', '來', '關(guān)注']]

from gensim import corpora,models
dictionary = corpora.Dictionary(word_list)
new_corpus = [dictionary.doc2bow(text) for text in word_list]
tfidf = models.TfidfModel(new_corpus)

tfidf_vec = []
for i in range(len(words)):
    string = words[i]
    string_bow = dictionary.doc2bow(string.split())
    string_tfidf = tfidf[string_bow]
    tfidf_vec.append(string_tfidf)
print(tfidf_vec)

在這里我們就可以得到tfidf向量,這里調(diào)用的是gensim庫計(jì)算的tfidf向量憔古,你也可以直接調(diào)用sklearn庫來計(jì)算tfidf向量遮怜,怎么操作看上面的那篇文章,里面都有介紹鸿市。我們來看一下得到的tfidf向量長什么樣子

[[(0, 0.35355339059327373),
  (1, 0.35355339059327373),
  (2, 0.35355339059327373),
  (3, 0.35355339059327373),
  (4, 0.35355339059327373),
  (5, 0.35355339059327373),
  (6, 0.35355339059327373),
  (7, 0.35355339059327373)],
 [(8, 0.18147115159841573),
  (9, 0.49169813431045906),
  (10, 0.49169813431045906),
  (11, 0.49169813431045906),
  (12, 0.49169813431045906)],
 [(8, 0.2084041054460164),
  (13, 0.5646732768699807),
  (14, 0.5646732768699807),
  (15, 0.5646732768699807)]]

很明顯锯梁,句子的長度不一樣,所以得到的tfidf向量的維度也不一樣焰情。那么我們該怎么操作呢陌凳?——可以用lsi向量來保證向量的維度一致

# num_topics參數(shù)可以用來指定維度
lsi_model = models.LsiModel(corpus = tfidf_vec,id2word = dictionary,num_topics=2)

lsi_vec = []
for i in range(len(words)):
    string = words[i]
    string_bow = dictionary.doc2bow(string.split())
    string_lsi = lsi_model[string_bow]
    lsi_vec.append(string_lsi)
print(lsi_vec)

看一下結(jié)果

[[(1, 2.8284271247461907)],
 [(0, 1.6357709481422218)],
 [(0, 1.4464385059387106)]]

sklearn庫的機(jī)器學(xué)習(xí)算法很齊全,你可以調(diào)用這些算法包來進(jìn)行操作内舟。但是sklearn里的算法要求數(shù)據(jù)的格式必須是array格式合敦,所以我們得想辦法把gensim計(jì)算的tfidf向量格式轉(zhuǎn)化為array格式。按照下面操作即可

from scipy.sparse import csr_matrix
data = []
rows = []
cols = []
line_count = 0
for line in lsi_vec:
    for elem in line:
        rows.append(line_count)
        cols.append(elem[0])
        data.append(elem[1])
    line_count += 1
lsi_sparse_matrix = csr_matrix((data,(rows,cols))) # 稀疏向量
lsi_matrix = lsi_sparse_matrix.toarray() # 密集向量
print(lsi_matrix)

結(jié)果長這樣

array([[0.        , 2.82842712],
       [1.63577095, 0.        ],
       [1.44643851, 0.        ]])

我們的目的已經(jīng)達(dá)到验游〕涞海肯定有人會(huì)問,你為啥不直接調(diào)用sklearn里計(jì)算tfidf向量的方法耕蝉,那多方便崔梗,多直接。何必這樣轉(zhuǎn)換來轉(zhuǎn)換去的垒在。

這是有原因的蒜魄,假設(shè)你的數(shù)據(jù)量很大,幾百萬條场躯,那么用sklearn計(jì)算的tfidf向量維度會(huì)非常大谈为,最后調(diào)用機(jī)器學(xué)習(xí)算法包的時(shí)候就會(huì)報(bào)錯(cuò)。如果你調(diào)用gensim來計(jì)算tfidf向量踢关,然后再采用上述的方法伞鲫,就可以對向量進(jìn)行降維了,而且你還可以指定維度签舞。在lsi向量那一步進(jìn)行操作榔昔,num_topics參數(shù)可以用來指定維度

總結(jié)

以上便是整個(gè)中文文本的預(yù)處理了驹闰,這個(gè)流程可以應(yīng)付大多數(shù)的文本處理任務(wù)。你把文本轉(zhuǎn)換為向量之后撒会,后面的操作就很容易了嘹朗,調(diào)用sklearn算法包,或者自己寫一個(gè)機(jī)器學(xué)習(xí)的算法诵肛,這些都是有章法可循的屹培。

希望可以幫助到大家,如果你覺得這篇文章對你有一定的幫助怔檩,那就點(diǎn)個(gè)贊支持一下吧褪秀!如果有什么問題的話也可以在文章下面評論,我們一起交流解決問題薛训!


以下是我所有文章的目錄媒吗,大家如果感興趣,也可以前往查看
??戳右邊:打開它乙埃,也許會(huì)看到很多對你有幫助的文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闸英,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子介袜,更是在濱河造成了極大的恐慌甫何,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遇伞,死亡現(xiàn)場離奇詭異辙喂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸠珠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門巍耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渐排,你說我怎么就攤上這事炬太。” “怎么了飞盆?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵娄琉,是天一觀的道長次乓。 經(jīng)常有香客問我吓歇,道長,這世上最難降的妖魔是什么票腰? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任城看,我火速辦了婚禮,結(jié)果婚禮上杏慰,老公的妹妹穿的比我還像新娘测柠。我一直安慰自己炼鞠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布轰胁。 她就那樣靜靜地躺著谒主,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赃阀。 梳的紋絲不亂的頭發(fā)上霎肯,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音榛斯,去河邊找鬼观游。 笑死,一個(gè)胖子當(dāng)著我的面吹牛驮俗,可吹牛的內(nèi)容都是我干的懂缕。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼王凑,長吁一口氣:“原來是場噩夢啊……” “哼搪柑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荤崇,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤拌屏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后术荤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倚喂,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年瓣戚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了端圈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡子库,死狀恐怖舱权,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仑嗅,我是刑警寧澤宴倍,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站仓技,受9級(jí)特大地震影響鸵贬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脖捻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一阔逼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧地沮,春花似錦嗜浮、人聲如沸羡亩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畏铆。三九已至,卻和暖如春吉殃,著一層夾襖步出監(jiān)牢的瞬間及志,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工寨腔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留速侈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓迫卢,卻偏偏與公主長得像倚搬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子乾蛤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 前面的文章主要從理論的角度介紹了自然語言人機(jī)對話系統(tǒng)所可能涉及到的多個(gè)領(lǐng)域的經(jīng)典模型和基礎(chǔ)知識(shí)每界。這篇文章,甚至之后...
    我偏笑_NSNirvana閱讀 13,887評論 2 64
  • 命名實(shí)體識(shí)別 命名實(shí)體的提出源自信息抽取問題家卖,即從報(bào)章等非結(jié)構(gòu)化文本中抽取關(guān)于公司活動(dòng)和國防相關(guān)活動(dòng)的結(jié)構(gòu)化信息眨层,...
    我偏笑_NSNirvana閱讀 10,222評論 1 35
  • 主要內(nèi)容 自然語言輸入編碼 前饋網(wǎng)絡(luò) 卷積網(wǎng)絡(luò) 循環(huán)網(wǎng)絡(luò)(recurrent networks ) 遞歸網(wǎng)絡(luò)(re...
    JackHorse閱讀 4,114評論 0 2
  • 薛定諤的貓 文:Recycler 106/316.1295 薛定諤的貓,很多人都聽說過這個(gè)名詞上荡,但是不了解其中的內(nèi)...
    Recycler閱讀 596評論 0 0
  • 今晚趴樱, 我在下了很大決心后, 也終于按下了那個(gè)鍵酪捡, 結(jié)束了一切叁征。 過了今晚, 我們不是所謂的兄妹逛薇, 不是談心的知己...
    至暮無成閱讀 270評論 1 1