テキスト分類(三):テキストを語袋モデルに変換する

7639 ワード

第2編では、ネット易のニュース記事をどのように登るかについて言及し、面倒だと感じたら、ネット上の既存のリソースを直接使用することができます.例えば:捜犬ニュースデータ、清華ニュースデータ.個人的には検索犬のニュースデータが雑然としているような気がしますが、清華大学のニュースデータは初歩的な洗浄を経たはずです.清華ニュースのダウンロードアドレスを添付します:住所は停止語表を分かち合って、テキストにあまり影響しない語を取り除くことができます.
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

import numpy as np
from gensim import corpora, models, similarities
from pprint import pprint
import time
import jieba
import os
from six import iteritems

basedir = "corpus/news/"
dir_list = ['affairs','constellation','economic','edu','ent','fashion','game','home','house','lottery','science','sports','stock']

fw = open("news.tab","w") #          
fw_type = open("type.tab","w") #      , news.tab    
num = -1
for e in dir_list:
    num += 1
    indir = basedir + e + '/'
    files = os.listdir(indir)
    count = 0
    for file in files:
        if count > 10000: #       10000 
            break
        count += 1            
        filepath = indir + file
        with open(filepath,'r') as fr:
            text = fr.read()
        text = text.decode("utf-8").encode("utf-8")
        seg_text = jieba.cut(text.replace("\t"," ").replace("
"
," ")) outline = " ".join(seg_text) + "
"
outline = outline.encode("utf-8") #print outline fw.write(outline) fw.flush() fw_type.write(str(num) + "
"
) fw_type.flush() fw.close() fw_type.flush() def load_stopwords(): f_stop = open('stopwords.tab') sw = [line.strip().decode("utf-8") for line in f_stop] f_stop.close() return sw stop_words = load_stopwords() print ' --' t_start = time.time() dictionary = corpora.Dictionary(line.split() for line in open('news.tab')) stop_ids = [dictionary.token2id[stopword] for stopword in stoplist if stopword in dictionary.token2id] once_ids = [tokenid for tokenid,docfreq in iteritems(dictionary.dfs) if docfreq == 1] dictionary.filter_tokens(stop_ids + once_ids) dictionary.compactify() dictionary.save('corpora.dict') # dictionary print " , %.3f " % (time.time() - t_start) #dictionary = corpora.Dictionary.load('corpora.dict') # dictionary print " --" t_start = time.time() class MyCorpus(object): def __iter__(self): for line in open("news.tab"): yield dictionary.doc2bow(line.split()) corpus_memory_friendly = MyCorpus() corpus = [] for vector in corpus_memory_friendly: corpus.append(vector) print " , %.3f " % (time.time() - t_start) print ' --' t_start = time.time() corpora.MmCorpus.serialize("corpus.mm",corpus) # corpus print " , %.3f " % (time.time() - t_start) corpus = corpora.MmCorpus("./corpus.mm") # corpus

上記のコードを介して,テキストのベクトルを生成することができる.