Kaggle - 災害ツイートについての自然言語処理(5) - 単語ベクター化

Natural Language Processing with Disaster Tweetsrに関する5回目の記事です。

Natural Language Processing with Disaster Tweets

今回は、単語ベクター化モデルの一つであるGloVeを試してみます。

単語分割

まずはツイートを単語に分割します。

単語分割する際にword_tokenizeメソッドを使うと、カンマや疑問符といった記号、アポストロフィによる短縮形にもうまく対応することができます。

またisalphaメソッドは文字列中のすべての文字が英字で、かつ 1 文字以上ある場合に真を返します。

[ソース]

1
2
3
4
5
6
7
8
def create_corpus(df):
corpus=[]
for tweet in tqdm(df['text']):
words=[word.lower() for word in word_tokenize(tweet) if((word.isalpha()==1) & (word not in stop))]
corpus.append(words)
return corpus

corpus = create_corpus(df)

[結果]

単語ベクター化

GloVeの学習済みモデルを準備します。3つの次元(50 D ,100 D, 200 D)が用意されていますが、今回は100 Dを使います。

処理後半のpad_sequencesメソッドでは、要素の合わない配列に対して、0 で埋めることで配列のサイズを一致させています。

paddingは前後どちらを埋めるか、truncatingは長いシーケンスの前後どちらを切り詰めるかを指定する引数で、今回は’post’(後ろ)を指定しています。

[ソース]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
embedding_dict={}
with open('../input/glove-global-vectors-for-word-representation/glove.6B.100d.txt','r') as f:
for line in f:
values = line.split()
word = values[0]
vectors = np.asarray(values[1:],'float32')
embedding_dict[word] =vectors
f.close()

MAX_LEN = 50
tokenizer_obj = Tokenizer()
tokenizer_obj.fit_on_texts(corpus)
sequences = tokenizer_obj.texts_to_sequences(corpus)

tweet_pad = pad_sequences(sequences, maxlen=MAX_LEN, truncating='post', padding='post')

word_index = tokenizer_obj.word_index
print('Number of unique words:',len(word_index))

[結果]

ユニークな単語数は20342となりました。

単語ベクター配列作成

単語ごとのベクター値を取得し、結果をembedding_matrixに格納します。

[ソース]

1
2
3
4
5
6
7
8
9
10
num_words = len(word_index) + 1
embedding_matrix = np.zeros((num_words, 100))

for word,i in tqdm(word_index.items()):
if i > num_words:
continue

emb_vec = embedding_dict.get(word)
if emb_vec is not None:
embedding_matrix[i] = emb_vec

[結果]

次回はBaseline Modelを使って、災害ツイートどうかの判定を行い、結果を提出してみます。