Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

単語のID化

More than 5 years have passed since last update.

よく前処理に使う単語のID化を例にとって、collectionsの話

単語のID化

Is this a pen ? This is a pen .と文字列(文)があったとすると、0 1 2 3 4 1 0 2 3 5みたいにそれぞれの単語ごとにIDを振っていきます。
今回は大文字小文字の区別をしていません。
0=is, 1=this...とこんな感じの対応になります。
プログラムにおこすと下記のような感じになります。

サンプルコード(python3)

word2id.py
#usr/bin/python
#python3(3.5)
import collections

word2id = collections.defaultdict(lambda: len(word2id) )
sentence = "Is this a pen ? This is a pen ."

def convert_word(sentence):
    return [word2id[word.lower()] for word in sentence.split()]

print("sentence    :", sentence)
print("id_sentence :", *convert_word(sentence) )
print("dict        :", dict(word2id) )

出力

sentence : Is this a pen ? This is a pen .
id_sentence : 0 1 2 3 4 1 0 2 3 5
dict : {'.': 5, '?': 4, 'is': 0, 'this': 1, 'pen': 3, 'a': 2}

今回は、.lower()をつかって全て小文字にしてから辞書に登録しています。
辞書はcollectionsモジュールの中にあるdefaultdictを使用しています。
defaultdictは、keyを入れた時、そのkeyが存在しなかった場合に自分で決めたものを入れといてくれるものです。
今回は、lambda: len(word2id)とすることで、新しく入ってきたkeyに対して新しい番号を振ることができます。
他の使い方としては、collections.defaultdict(list)とすると未知のkeyが入ってきた場合に自動でlist()を作っといてくれます。

collectionsにはCounter, OrderedDict, deque, namedtupleが入っており、どれも便利なものです。

コードはpython3用なので、python2でやる場合は最後から2行目のところを*convert_word(sentence)から' '.join(convert_word(sentence)にすると動きます。
python3ではprintは関数なので、*をつかって引数として渡せますが、pythonn2ではこれでは渡せないようです。

Kodaira_
python / rails ruby / 自然言語処理(NLP)をやっています
http://cl.sd.tmu.ac.jp/~kodaira/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away