問(wèn)答機(jī)器人的Python分類器

導(dǎo)語(yǔ)

現(xiàn)在問(wèn)答機(jī)器人真是火的不要不要的,大致分為兩類:普適多場(chǎng)景的和單一專業(yè)場(chǎng)景的問(wèn)答機(jī)器人。由于資源有限财著,不知死活的筆者只做了單一場(chǎng)景的分類器,如對(duì)海量數(shù)據(jù)撑碴、多場(chǎng)景的問(wèn)答機(jī)器人感興趣的話可以參考QA問(wèn)答系統(tǒng)中的深度學(xué)習(xí)技術(shù)實(shí)現(xiàn)撑教,對(duì)于該網(wǎng)站在NLP方面的貢獻(xiàn)簡(jiǎn)直不能更感激(請(qǐng)?jiān)试S獻(xiàn)上我的膝蓋)!

1. 問(wèn)答語(yǔ)料庫(kù)

由于僅面向業(yè)務(wù)灰羽,場(chǎng)景單一驮履,所以訓(xùn)練集語(yǔ)料庫(kù)只包含20類鱼辙,共400多條問(wèn)題廉嚼,每類問(wèn)題對(duì)應(yīng)一個(gè)回答。

2. 訓(xùn)練詞向量

不知死活的筆者決定興師動(dòng)眾的選擇word2vec將訓(xùn)練集語(yǔ)料轉(zhuǎn)化為詞向量作為模型的輸入倒戏。關(guān)于word2vec的原理及其C語(yǔ)言的詞向量訓(xùn)練方法怠噪,請(qǐng)參考word2vec詞向量訓(xùn)練及中文文本相似度計(jì)算以及該博文內(nèi)的鏈接。筆者根據(jù)【python gensim使用】word2vec詞向量處理中文語(yǔ)料用Python訓(xùn)練的中文詞向量模型杜跷。(英文的詞向量訓(xùn)練可以參考
利用Gensim訓(xùn)練關(guān)于英文維基百科的Word2Vec模型(Training Word2Vec Model on English Wikipedia by Gensim)

2.1 中文語(yǔ)料庫(kù)

可以參考Windows下使用Word2vec繼續(xù)詞向量訓(xùn)練中提到的語(yǔ)料庫(kù)傍念,不知死活的筆者選擇從搜狗實(shí)驗(yàn)室下載了全網(wǎng)新聞?wù)Z料,不得不說(shuō)葛闷,搜狗實(shí)驗(yàn)室是非常具有貢獻(xiàn)力的憋槐!完整版1.02G,解壓后2.22G淑趾,共378個(gè)文件阳仔,HTML格式,你值得擁有扣泊!

News List.png

2.2 分詞合并

首先是分詞近范,可供選擇的工具有很多:Jieba、ANSJ延蟹、NLPIR评矩、LTP等等,在此筆者選擇Jieba進(jìn)行分詞:

import jieba  

def readLines(filename):
    # read txt or csv file
    fp = open(filename, 'r')
    lines = []
    for line in fp.readlines():
        line = line.strip()
        line = line.decode("utf-8")
        lines.append(line)
    fp.close()
    return lines

def parseSent(sentence):
    # use Jieba to parse sentences
    seg_list = jieba.cut(sentence)
    output = ' '.join(list(seg_list)) # use space to join them
    return output

然后將所有文檔合并阱飘,并寫(xiě)入corpus.csv中:

import re  
import codecs  
import os 

# only content is valid
pattern = "<content>(.*?)</content>"
csvfile = codecs.open("corpus.csv", 'w', 'utf-8')
fileDir = os.listdir("./corpus/")
for file in fileDir:
    with open("./corpus/%s" % file, "r") as txtfile:
        for line in txtfile:
            m = re.match(pattern, line)
            if m:
                segSent = parseSent(m.group(1))
                csvfile.write("%s" % segSent)

特別mark以下斥杜,codecs這個(gè)包在調(diào)整編碼方面的貢獻(xiàn)真的不要太大,尤其是常常對(duì)于中文編碼無(wú)力的不知死活的筆者來(lái)說(shuō)沥匈,簡(jiǎn)直是神器蔗喂!
對(duì)于中文的編碼處理:utf-8 --> unicode --> utf-8

2.3 訓(xùn)練word2vec模型

在此,筆者使用gensim的word2vec進(jìn)行詞向量的訓(xùn)練:

from gensim.models import word2vec
import logging

logging.basicConfig(format = '%(asctime)s : %(levelname)s : %(message)s', level = logging.INFO)
sentences = word2vec.Text8Corpus("corpus.csv")  # 加載語(yǔ)料
model = word2vec.Word2Vec(sentences, size = 400)  # 訓(xùn)練skip-gram模型

# 保存模型咐熙,以便重用
model.save("corpus.model")
# 對(duì)應(yīng)的加載方式
# model = word2vec.Word2Vec.load("corpus.model")

# 以一種C語(yǔ)言可以解析的形式存儲(chǔ)詞向量
model.save_word2vec_format("corpus.model.bin", binary = True)
# 對(duì)應(yīng)的加載方式
# model = word2vec.Word2Vec.load_word2vec_format("corpus.model.bin", binary=True)

關(guān)于調(diào)參弱恒,可自行參考gensim文檔。

2.4 獲得詞向量

接下來(lái)就是使用上述獲得的model將訓(xùn)練集的中文語(yǔ)料轉(zhuǎn)化為詞向量:

def getWordVecs(wordList):
    vecs = []
    for word in wordList:
        word = word.replace('\n', '')
        try:
            # only use the first 500 dimensions as input dimension
            vecs.append(model[word])
        except KeyError:
            continue
    # vecs = np.concatenate(vecs)
    return np.array(vecs, dtype = 'float')

3. 構(gòu)建模型

3.1 Naive Bayes

效果良好棋恼,效率高返弹!

from sklearn.naive_bayes import MultinominalNB

MNB = MultinominalNB(alpha = 0.000607)

3.2 Random Forest

效果良好锈玉,效率一般。

from sklearn.ensemble import RandomForestClassifier

RFC = RandomForestClassifier(min_samples_leaf = 3, n_estimators = 100)

3.3 RBM + Logistic Regression

效果很好义起,效率很低……由于這個(gè)模型只需要訓(xùn)練一次拉背,所以效率關(guān)系不大(抱歉我隨便亂用模型,實(shí)際上這模型本身來(lái)源于sklearn上的實(shí)例……原本著使用效果至上的原則默终,然而至于為何這樣搭配……)

from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.neural_network import BernoulliRBM

rbm.learning_rate = 0.07
rbm.n_iter = 50
# more components tend to give better prediction performance, but larger fitting time
rbm.n_components = 800
rbm.batch_size = 10
logistic.C = 10000.0
rbm = BernoulliRBM(random_state = 0, verbose = True)
logistic = LogisticRegression()
clf = Pipeline(steps = [('rbm', rbm), ('logistic', logistic)])

總的來(lái)說(shuō)椅棺,神經(jīng)網(wǎng)絡(luò)(例如MLP)對(duì)這類文本分類問(wèn)題效果普遍不錯(cuò),至于傳統(tǒng)機(jī)器學(xué)習(xí)算法齐蔽,樸素貝葉斯也有不俗的表現(xiàn)两疚。

4. 其他

這次學(xué)習(xí)到sklearn中一個(gè)非常有用的功能sklearn.externals.joblib,可用于導(dǎo)出訓(xùn)練好的模型含滴,這對(duì)于training cost非常高的模型來(lái)說(shuō)實(shí)在是非常好用坝詹场!

from sklearn.externals import joblib

# save classifier
joblib.dump(clf, "Classifier.pkl")
# load classifier
clf = joblib.load("Classifier.pkl")

其次就是sklearn中的sklearn.pipeline.Pipeline谈况,將多個(gè)模型結(jié)合在一起勺美,通過(guò)Pipeline的方式進(jìn)行訓(xùn)練,真的是非常方便氨稀赡茸!

from sklearn.pipeline import Pipeline

clf = Pipeline(steps = [clf1, clf2])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祝闻,隨后出現(xiàn)的幾起案子占卧,更是在濱河造成了極大的恐慌,老刑警劉巖治筒,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屉栓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡耸袜,警方通過(guò)查閱死者的電腦和手機(jī)友多,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)堤框,“玉大人域滥,你說(shuō)我怎么就攤上這事◎谧ィ” “怎么了启绰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沟使。 經(jīng)常有香客問(wèn)我委可,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任着倾,我火速辦了婚禮拾酝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卡者。我一直安慰自己蒿囤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布崇决。 她就那樣靜靜地躺著材诽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恒傻。 梳的紋絲不亂的頭發(fā)上脸侥,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音碌冶,去河邊找鬼湿痢。 笑死涝缝,一個(gè)胖子當(dāng)著我的面吹牛扑庞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拒逮,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼罐氨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了滩援?” 一聲冷哼從身側(cè)響起栅隐,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玩徊,沒(méi)想到半個(gè)月后租悄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恩袱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年泣棋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔塔。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潭辈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澈吨,到底是詐尸還是另有隱情把敢,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布谅辣,位于F島的核電站修赞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏桑阶。R本人自食惡果不足惜柏副,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一熙尉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搓扯,春花似錦检痰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至换可,卻和暖如春椎椰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沾鳄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工慨飘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人译荞。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓瓤的,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親吞歼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子圈膏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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