文章中の単語にIDを付与し、辞書を作成する



ソフトウェア

公開日:2021/7/31         

前提知識
 ・Pythonとは


pythonによる文章にIDを付ける方法、IDから文章を生成する方法を説明します。これはseqGANなどの機械学習で文章を分析する際に必要となります。

■具体例
 ・python : 3.9.5
 ・プログラムファイル:id2doc.zip

<文章にIDを付け、辞書を作成する>
最初に文章を各単語に分割する必要があります。これを形態素解析といいます。

import MeCab

text = ['今日は月曜日である。' , '明日は火曜日である。']

tagger = MeCab.Tagger("-Owakati")
data = [tagger.parse(n) for n in text] # 分かち書きに変換

word2id , id2word = {},{}

for line in data:    # 1行ずつ取得
    for word in line.split(' '):    # 1単語ずつ取得
        if word not in word2id and word !='\n':    # 辞書にない単語を取得
            id = len(word2id) + 1    # id = 0はパディング用
            word2id[word] = id
            id2word[id] = word

print(word2id)

   ⇒ {'今日': 1, 'は': 2, '月': 3, '曜日': 4, 'で': 5, 'ある': 6, '。': 7, '明日': 8, '火': 9}

print(id2word)

   ⇒ {1: '今日', 2: 'は', 3: '月', 4: '曜日', 5: 'で', 6: 'ある', 7: '。', 8: '明日', 9: '火'}


<辞書に基づいてテキストからID生成>
上記で作成したIDの対応表をもとに、文章にIDを割り当てます。0は空白です。

id_data = []
max_len = 10    # 1列の配列数

for line in data:
    data_tmp = []
    for word in line.split(' '):
        if word != '\n':data_tmp.append(word2id[word]) # 単語をIDに変換して追加
    q , mod = divmod(len(data_tmp) , max_len)     # 1文が何列になるか演算。q列でmod文字余る
    if mod > 0 : flug = 1     # 余りが出たことを判別
    else : flug = 0

    for i in range(q + flug):
        id = data_tmp[i * max_len : i * max_len + max_len]     # ID配列生成
        if i == q and flug > 0:     # 余りが出た場合はpaddingして1列生成する
            id = np.pad(id,[0, max_len - mod])
        id_data.append(id)     # ID化された文章を追加

print(id_data)

   ⇒ [array([1, 2, 3, 4, 5, 6, 7, 0, 0, 0]), array([8, 2, 9, 4, 5, 6, 7, 0, 0, 0])]


<与えられたIDから文章生成>
異なるIDの場合は異なる文章が作られます。これでseqGANによって生成された文章を確認できます。

id2doc = ''

for line in id_data:
    for id in line:
        if id != 0: id2doc += ''.join(id2word[id])
    id2doc += ''.join('\n')

print(id2doc)

   ⇒今日は月曜日である。
      明日は火曜日である。












サブチャンネルあります。⇒ 何かのお役に立てればと

関連記事一覧



ソフトウェア