テキスト分類(三):テキストを語袋モデルに変換する
第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
上記のコードを介して,テキストのベクトルを生成することができる.