ステージ3-2: タームを素性とする特徴ベクトル生成の例(英語編), 文分割 + トークン化 + ステミング + ストップワード除去 (情報工学実験 3 : データマイニング班)
目次- 想定環境、追加インストール
- 文書集合からターム素性集合(コードブック)を作る
文分割 + トークン化 + ステミング + ストップワード除去を含んだ例
- case 1:コードブックを素性とする文書ベクトルを作る(直接ベクトル生成)
- case 2 (辞書型->DictVectorizer) は省略。
- case 3 (疎行列) は省略。
想定環境、追加インストール
- OS: Mac OS X 10.8.x (10.7.x以降であれば同じ方法で問題無いはず)
- Python: 2.7.x
- Mercurial: 2.2
- NLTK: 2.0.4 (nltk.__version__)
# 追加インストール。 # python インタプリタ上で nltk.download() を実行し、 # 以下のモデルやデータをダウンロード。 import nltk nltk.download() # (追加1) punkt / Punkt Tokenizer Models # (追加2) corpora / wordnet # (追加3) corpora / stopwords
文書集合からターム素性集合(コードブック)を作る
- nltk.tokenize.sent_tokenise(): doc -> sentences分割
- nltk.tokenize.wordpunct_tokenize(): sentence -> words(tokens)分割
- nltk.stem.wordnet.WordNetLemmatizer.lemmatize(): word(token)を基本形(らしきもの)に修正
docs = [] docs.append("This is test. The name of this class is data-mining.") docs.append("That is test too.") docs.append("There are so many tests.") # 小文字化処理の例。 docs[0].lower() # doc -> sentences分割処理の例。 import nltk from nltk.tokenize import word_tokenize, wordpunct_tokenize, sent_tokenize sents = sent_tokenize(docs[0].lower()) sents # sentence -> words 分割処理の例。トークン化。 tokens = wordpunct_tokenize(sents[0]) tokens # token を基本形(らしきもの)に修正する例。ステミング。 wnl = nltk.stem.wordnet.WordNetLemmatizer() wnl.lemmatize( tokens[0] ) def collect_words_eng(docs): u'''英文書集合 docs からの単語コードブック作成例。 シンプルに文書集合を予め決めうちした方式で処理する。 必要に応じて指定できるようにしていた方が使い易いかも。 <使用しているNLTKライブラリの説明> nltk.sent_tokenize: 文章(doc)を文(sentence)に分割する。 nltk.wordpunct_tokenize: 文(sentence)を単語(word)に分割する。通称トークン化。 nltk.lemmatize: 単語(word)を基本形(らしきもの)に修正する。通称ステミング。 nltk.corpus.stopwords: 文章を特徴付ける要素として不適切なものを除外するためのブラックリスト。通称ストップワード。 ''' import nltk from nltk.tokenize import word_tokenize, wordpunct_tokenize, sent_tokenize codebook = [] stopwords = nltk.corpus.stopwords.words('english') stopwords.append('.') # ピリオドを追加。 stopwords.append(',') # カンマを追加。 stopwords.append('') # 空文字を追加。 wnl = nltk.stem.wordnet.WordNetLemmatizer() for doc in docs: for sent in sent_tokenize(doc): for word in wordpunct_tokenize(sent): this_word = wnl.lemmatize(word.lower()) if this_word not in codebook and this_word not in stopwords: codebook.append(this_word) return codebook codebook = collect_words_eng(docs)
コードブックを素性とする文書ベクトルを作る (直接ベクトル生成)
def make_vectors_eng(docs, codebook): u'''コードブックを素性とする文書ベクトルを作る(直接ベクトル生成) n-gramモデルの例と流れは一緒。 「doc=1文とは限らない」ケースにも対応するよう拡張。 ''' vectors = [] wnl = nltk.stem.wordnet.WordNetLemmatizer() for doc in docs: this_vector = [] fdist = nltk.FreqDist() for sent in sent_tokenize(doc): for word in wordpunct_tokenize(sent): this_word = wnl.lemmatize(word.lower()) fdist.inc(this_word) for word in codebook: this_vector.append(fdist[word]) vectors.append(this_vector) return vectors data = make_vectors_eng(docs, codebook)