元のページ

ステージ3-2: タームを素性とする特徴ベクトル生成の例(英語編), 文分割 + トークン化 + ステミング + ストップワード除去 (情報工学実験 3 : データマイニング班)

目次

想定環境、追加インストール

# 追加インストール。
#  python インタプリタ上で nltk.download() を実行し、
#  以下のモデルやデータをダウンロード。

import nltk
nltk.download()
# (追加1) punkt / Punkt Tokenizer Models
# (追加2) corpora / wordnet
# (追加3) corpora / stopwords

文書集合からターム素性集合(コードブック)を作る

docs = []
docs.append("This is test.")
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: 文章を特徴付ける要素として不適切なものを除外するためのブラックリスト。通称ストップワード。
    '''
    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)





参考サイト一覧