用python處理movie數(shù)據(jù)集

正文之前的BB時(shí)間

因?yàn)閭€(gè)人實(shí)驗(yàn)需要,要對(duì)Cornell Movie Dialogs Corpus進(jìn)行一些預(yù)處理研叫,記錄一下處理過程孩哑,以后其他類似的數(shù)據(jù)處理可以借鑒老玛。

我的實(shí)驗(yàn)是實(shí)現(xiàn)一個(gè)主題驅(qū)動(dòng)的自動(dòng)聊天機(jī)器人媒峡,Cornell Movie Dialogs Corpus是一個(gè)從電影數(shù)據(jù)中生成的電影對(duì)白語料庫瘟栖,包含大概600部電影對(duì)白,并且語料中含有電影名谅阿、角色慢宗、IMDB評(píng)分等許多信息。但我的實(shí)驗(yàn)中只需要里面的純對(duì)話信息奔穿,將每個(gè)對(duì)話處理成前面幾句是對(duì)話上下文context、最后一句是對(duì)話回復(fù)response敏晤,并需要替換其中的低頻詞贱田,將其保存為tfrecord。

語料庫中原始文件包含:

  • movie_titles_metadata.txt 包含每部電影標(biāo)題信息
  • movie_characters_metadata.txt 包含每部電影角色信息
  • movie_lines.txt 每個(gè)表達(dá)(utterance)的實(shí)際文本
  • movie_conversations.txt 對(duì)話的結(jié)構(gòu)嘴脾,用語句ID表示
  • raw_script_urls.txt 原始來源的url
    *具體介紹可見文章http://blog.csdn.net/zdcs/article/details/53465855

我已經(jīng)用numpy和pandas在jupyter中將上面的文件處理成 convLine.csv 和 lineIndex.csv 兩個(gè)文件男摧,兩個(gè)文件格式如下:
convLine.csv 對(duì)話文件,每個(gè)對(duì)話語句line用ID表示:
L1,L2,L3 || L4,L5,L6,L7,L8 || L9,L10,L11 ...
lineIndex.csv 語句文件译打,每個(gè)語句lineID對(duì)應(yīng)的真正的句子:
L1,hello! || L2, how are you? || L3, fine,thank you. ...
(||表示換行)

下面對(duì)這兩個(gè)文件進(jìn)行處理耗拓,正文開始~~

這里是正文

處理數(shù)據(jù)集的過程有兩輪遍歷。
第一輪遍歷完成文件對(duì)齊奏司、分割seq2seq數(shù)據(jù)集乔询、獲得數(shù)據(jù)集大小和詞匯表;
第二輪遍歷得到忽略詞韵洋、獲得topic訓(xùn)練數(shù)據(jù)集以及寫入tfrecord竿刁。

第一輪遍歷

利用lineIndex.csv 文件建立字典黄锤。

meta_lineIndex_path = os.path.join(config.data_root, 'lineIndex.csv')
    convline_dict = {}
    with open(meta_lineIndex_path, newline='')as f:
        lineIndex_reader = csv.reader(f)
        for row in lineIndex_reader:
            convline_dict[row[0]] = row[1]

由于數(shù)據(jù)集中有的的對(duì)話比較長、輪數(shù)較多食拜,因此進(jìn)行了采樣鸵熟,將輪次長的對(duì)話拆分成幾個(gè)輪次短的對(duì)話,分割次數(shù)視長度而定负甸。這里需要注意同一個(gè)對(duì)話拆分開后流强,分割數(shù)據(jù)集時(shí)應(yīng)該分到一起。
采樣過程示意:
對(duì)話數(shù)據(jù)
L1, L2, L3, L4, L5, L6, L7, L8
[---對(duì)話1---]
[--------對(duì)話2-------]
[--------------對(duì)話3---------------]

new_max_turn = min(len(row)-1,max_turn)
    assert min_turn <= new_max_turn, "context最小輪數(shù)大于最大輪數(shù)"
    sampling_count_range = list(map(int, sampling_range.split(',')))
    sample_count_tag = bisect.bisect_left(sampling_count_range, new_max_turn)//獲得采樣次數(shù)
    context_list = list()
    response = list()

    while sample_count_tag != 0:
        context = list()
        context_truns=new_max_turn
        if sample_count_tag > 1:
            while True:
                alternative_context_truns=random.randint(
                    min_turn,
                    new_max_turn
                )
                if alternative_context_truns!=context_truns://防止重復(fù)采樣
                    context_truns=alternative_context_truns
                    break
        # 處理context
        for turn in row[:context_truns]:
            word_list = word_tokenize(convline_dict[turn])
            context.extend(list(word_list) + [end_of_turn_symbol])
        context_list.append(context)

        # 處理response
        word_list = word_tokenize(convline_dict[row[context_truns]])
        response.append(list(word_list) + [end_of_turn_symbol]) 
        #注意多次采樣的context和response分開
        sample_count_tag = sample_count_tag-1

采樣后得到了對(duì)話的context和response數(shù)據(jù)呻待,將其分割成訓(xùn)練集打月、測(cè)試集和驗(yàn)證集,更新詞匯表带污。

第二輪遍歷

將數(shù)據(jù)集中的詞表word_list轉(zhuǎn)換為idx_list僵控,并添加忽略詞symbol。

seq2seq_context = token_manager.translate_word_list_to_idx_list(context_word_list, False)
seq2seq_response = token_manager.translate_word_list_to_idx_list([go_symbol] + response_word_list, False)
topic_context = token_manager.translate_word_list_to_idx_list(context_word_list, True)
topic_response = token_manager.translate_word_list_to_idx_list(response_word_list, True)

寫入topic訓(xùn)練數(shù)據(jù)集以及生成tfrecord文件鱼冀。
完成报破!

正文之后再BB兩句

整個(gè)數(shù)據(jù)集處理過程還是比較簡單的,用到的技巧也不多千绪,以后再有其他實(shí)驗(yàn)也算有經(jīng)驗(yàn)了充易。
就是一開始采樣完分割數(shù)據(jù)集時(shí),沒有注意對(duì)同一個(gè)對(duì)話多次采樣獲得多個(gè)對(duì)話應(yīng)該分割到同一個(gè)數(shù)據(jù)集中荸型,差點(diǎn)造成實(shí)驗(yàn)造假盹靴。(|3」∠)。瑞妇。稿静。還好小H童靴幫我發(fā)現(xiàn)了~以后還是要多多注意!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辕狰,一起剝皮案震驚了整個(gè)濱河市改备,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔓倍,老刑警劉巖悬钳,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異偶翅,居然都是意外死亡默勾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門聚谁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來母剥,“玉大人,你說我怎么就攤上這事∠碧拢” “怎么了铭段?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秦爆。 經(jīng)常有香客問我序愚,道長,這世上最難降的妖魔是什么等限? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任爸吮,我火速辦了婚禮,結(jié)果婚禮上望门,老公的妹妹穿的比我還像新娘形娇。我一直安慰自己,他們只是感情好筹误,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布桐早。 她就那樣靜靜地躺著,像睡著了一般厨剪。 火紅的嫁衣襯著肌膚如雪哄酝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天祷膳,我揣著相機(jī)與錄音陶衅,去河邊找鬼。 笑死直晨,一個(gè)胖子當(dāng)著我的面吹牛搀军,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勇皇,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼罩句,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了敛摘?” 一聲冷哼從身側(cè)響起的止,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎着撩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匾委,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拖叙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赂乐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薯鳍。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挖滤,到底是詐尸還是另有隱情崩溪,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布斩松,位于F島的核電站伶唯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惧盹。R本人自食惡果不足惜乳幸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钧椰。 院中可真熱鬧粹断,春花似錦、人聲如沸嫡霞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诊沪。三九已至养筒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娄徊,已是汗流浹背闽颇。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寄锐,地道東北人兵多。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像橄仆,于是被迫代替她去往敵國和親剩膘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345