テキストマイニングの前処理。名詞抽出、ストップワード除去、珍しい単語の除去

pythonを使ったテキストマイニングの前処理メモ。名詞を抽出し、ストップワードや珍しい単語を除去する方法。



名詞を抽出し、ストップワードや珍しい単語を除去する


テキストマイニングにおける定番の前処理らしいです。pythonで試してみました。


もっと膨大な文章集合を実践的に扱う場合は、「10%以上の文章にでてきた単語を除去」とかもやるみたいです。正解があるわけではなく、扱うデータと目的に合わせて適宜変えるとよいと思います。


#coding:utf-8
import MeCab

def extractKeyword(text):
	u"""textを形態素解析して、名詞のみのリストを返す"""
	tagger = MeCab.Tagger()
	encoded_text = text.encode('utf-8')
	node = tagger.parseToNode(encoded_text).next
	keywords = []
	while node:
		if node.feature.split(",")[0] == "名詞":
			keywords.append(node.surface)
		node = node.next
	return keywords

def splitDocument(documents):
	u"""文章集合を受け取り、名詞のみ空白区切りの文章にして返す"""
	splitted_documents = []
	for d in documents:
		keywords = extractKeyword(d)
		splitted_documents.append(' '.join(keywords))
	return splitted_documents

def removeStoplist(documents, stoplist):
	u"""ストップワードを取り除く"""
	stoplist_removed_documents = []
	for document in documents:
		words = []
		for word in document.lower().split():
			if word not in stoplist:
				words.append(word)
		stoplist_removed_documents.append(words)
	return stoplist_removed_documents

def getTokensOnce(all_tokens):
	u"""一回しか出現しない単語を返す"""
	tokens_once = set([])
	for word in set(all_tokens):
		if all_tokens.count(word) == 1:
			tokens_once.add(word)
	return tokens_once

def removeTokensOnce(documents, tokens_once):
	u"""一回しか出現しない単語を取り除く"""
	token_removed_documents = []
	for document in documents:
		words = []
		for word in document:
			if word not in tokens_once:
				words.append(word)
		token_removed_documents.append(words)
	return token_removed_documents

if __name__ == "__main__":
	raw_documents = [u'私はやっぱりピアノを弾きます。',
		u'りんごは食べないですねー。',
		u'りんごは食べないですねー。',
		u'プレステのバイオハザード2懐かしいです。',
		u'今日が返却期限だったからあのDVDは返却したよ。']

	print 'raw_documents:'
	for d in raw_documents:
		print d
	print ''

	# 空白区切りの文字列を入れるリスト
	splitted_documents = splitDocument(raw_documents)

	print 'splitted_documents:'
	for d in splitted_documents:
		print d
	print ''

	stoplist = set('プレ ハザード'.split()) # 通常の文字列でよい
	print 'stoplist:'
	for s in stoplist:
		print s,
	print '\n'

	# ストップワードを除いた二重リスト
	stoplist_removed_documents = removeStoplist(splitted_documents, stoplist)

	print 'stoplist_removed_documents:'
	for t in stoplist_removed_documents:
		for w in t:
			print w,
		print ''
	print ''

	# 全ての単語を重複ありで含むリスト
	all_tokens = sum(stoplist_removed_documents, [])

	print 'all_tokens:'
	for t in all_tokens:
		print t,
	print '\n'

	# 一回しかでてこない単語のみを持つセット
	tokens_once = getTokensOnce(all_tokens)

	print 'tokens_once:'
	for t in tokens_once:
		print t,
	print '\n'

	# 一回しかでてこない単語を除いた最終的なテキスト
	preprocessed_documents = removeTokensOnce(stoplist_removed_documents, tokens_once)

	print 'preprocessed_documents:'
	for d in preprocessed_documents:
		for w in d:
			print w,
		print ''

出力結果は下記の通り。


raw_documents:
私はやっぱりピアノを弾きます。
りんごは食べないですねー。
りんごは食べないですねー。
プレステのバイオハザード2懐かしいです。
今日が返却期限だったからあのDVDは返却したよ。

splitted_documents:
私 ピアノ
りんご
りんご
プレ ステ バイオ ハザード 2
今日 返却 期限 DVD 返却

stoplist:
ハザード プレ

stoplist_removed_documents:
私 ピアノ
りんご
りんご
ステ バイオ 2
今日 返却 期限 dvd 返却

all_tokens:
私 ピアノ りんご りんご ステ バイオ 2 今日 返却 期限 dvd 返却

tokens_once:
今日 ステ 期限 dvd 2 私 ピアノ バイオ

preprocessed_documents:

りんご
りんご

返却 返却


参考リンク


Corpora and Vector Spaces

LSIやLDAを手軽に試せるGensimを使った自然言語処理入門

gensimに日本語Wikipediaを取り込むためのスクリプト

MeCabをPythonから使う注意点と

WindowsでMeCab Pythonを使う

【Python】 PythonからMeCabを使う。


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール