ゼファーネットのロゴ

LSTMを使用した災害ツイート分類– NLP

日付:

 この記事は、の一部として公開されました データサイエンスブログソン

NLPの紹介

 メールがスパムとハムに分類される方法や、ツイートが良いか悪いかに分類される方法を想像したことがありますか?..これらはすべて、NLPまたは自然言語処理の分野での進歩により発生しました。 NLPの助けを借りて、スパム分類モバイル、チャットボット、レコメンデーションシステムなどの多くのタスクを実行するためのいくつかのモデルが作成されます。NLPは現在最も急速に成長している分野のXNUMXつであり、貴重な洞察を得るためにいくつかの企業がこれに投資しています。

今日の記事では、災害ツイート分類の分析と作成について説明します。 この記事の後、テキストの前処理の概念とLSTMモデルの作成について理解します。

それでは、データセットを理解しましょう。

データセット

ここで使用しているデータセットは 災害ツイート データ。 5つの列が含まれていますが、そのうち「클라우드 기반 AI/ML및 고성능 컴퓨팅을 통한 디지털 트윈의 기초 – Edward Hsu, Rescale CPO 많은 엔지니어링 중심 기업에게 클라우드는 R&D디지털 전환의 첫 단계일 뿐입니다. 클라우드 자원을 활용해 엔지니어링 팀의 제약을 해결하는 단계를 넘어, 시뮬레이션 운영을 통합하고 최적화하며, 궁극적으로는 모델 기반의 협업과 의사 결정을 지원하여 신제품을 결정할 때 데이터 기반 엔지니어링을 적용하고자 합니다. Rescale은 이러한 혁신을 돕기 위해 컴퓨팅 추천 엔진, 통합 데이터 패브릭, 메타데이터 관리 등을 개발하고 있습니다. 이번 자리를 빌려 비즈니스 경쟁력 제고를 위한 디지털 트윈 및 디지털 스레드 전략 개발 방법에 대한 인사이트를 나누고자 합니다. ツイートデータを含む」列と「ターゲット与えられたツイートが災害であるかどうかを示す」列。 良い結果を得るには、いくつかのテキスト前処理技術のツイートデータを実行する必要があります。

製品の導入

まず、プロジェクトに必要なすべてのライブラリをインポートしましょう

import warnings warnings.simplefilter(action ='ignore'、category = Warning)import pandas as pd import numpy as np import re import nltk from nltk.corpus import stopwords from tqdm import tqdm import seaborn as sns sns.set_style( "darkgrid") matplotlib.pyplotをplt%matplotlibインラインとしてインポートします

それでは、パンダを使用して災害ツイートデータセットをインポートしましょう

data = pd.read_csv( "train.csv")

いくつかの行と列を分析していますが、

data.head()

seabornを使用して、災害および非災害のツイートの数をプロットしています。

sns.countplot(data ["target"])

画像

正規化された値のカウントの計算

データ["目標"]。値の数(正規化= )#normalized value counts
0 0.57034 1 0.42966名前:ターゲット、dtype:float64

データ分析の重要なステップとして、各ツイートの長さを計算し、長さデータに基づいてヒストグラムをプロットするための関数を作成します。

def length_plot(data、name):length = [データ内の文のlen(sentence.split())] plt.hist(length)plt.title(name)length_plot(data [data ["target"] == 0] ["text"]、 "災害ではありません")length_plot(data [data ["target"] == 1] ["text"]、 "災害")

次に、依存機能と独立機能を分離しましょう

X = data ["text"]#独立した機能y = data ["target"]#依存した機能y = np.array(y)#配列に変換

災害ツイートに存在するユニークな単語の数を計算します。

def unq_words(sentence):unq_words_list = [] for send in tqdm(sentence):for word in send.split():if word.lower()not in unq_words_list:unq_words_list.append(word.lower())else:pass return unq_words_list unique_words = unq_words(X)print( "存在する一意の単語の総数:"、len(unique_words))
存在するユニークな単語の総数:27983

いくつかの言葉は

unique_words [:20]

出力

['our'、'deeds'、'are'、'the'、'reason'、'of'、'this'、'#earthquake'、'may'、'allah'、'forgive'、'us'、 'all'、'forest'、'fire'、'near'、'la'、'ronge'、'sask。'、'canada']

ご存知のとおり、これはTwitterデータセットであるため、「#」と「@」で始まる単語がいくつか含まれている可能性があります。 それでは、「#」で始まるこれらの単語を見つけましょう

SYMBOL_1 = "#" sym1_words = [word.startswith(SYMBOL_1)の場合はunique_wordsの単語ごと] len(sym1_words)#1965

「#」で始まる単語のいくつかは

sym1_words [100:120]
['#az:'、'#wildhorses'、'#tantonationalforest!'、'#saltriverwildhorses'、'#sciencefiction'、'#internetradio'、'#collegeradix89û_'、'#warmbodies'、'#etcpb'、'# storm'、' #apocalypse'、' #pbban'、' #doublecups'、' #armageddon'、' #love'、' #truelove'、' #romance'、' #voodoo'、' #seduction'、'#占星術']

「@」で始まる単語

SYMBOL_2 = "@" sym2_words = [word.startswith(SYMBOL_2)の場合はunique_wordsの単語ごと] len(sym2_words)#2264

「@」で始まる単語のいくつかは

sym2_words [100:120]
['@cloudy_goldrush'、'@arsonistmusic'、'@safyuan'、'@local_arsonist'、'@diamorfiend'、'@casper_rmg'、'@ veronicadlcruz'、'@ 58hif'、'@ pcaldicott7'、'@_doofus_' 、'@slimebeast'、'@ bestcomedyvine'、'@pfannebeckers'、'@dattomm'、'@etribune'、'@acebreakingnews'、'@darkreading'、'@ caixxum5sos'、'@blazerfan'、'@ envw98' ]

「#」と「@」で始まる単語を分析すると、「@」で始まる単語は完全に役に立たないという結論に達することができます。モデルの精度には影響しないため、削除します。

データセットにはいくつかのURLが存在するので、そこに存在するURLを削除する関数を書いてみましょう。

def url_remover(text):url_patterns = re.compile(r'https?// S + | www.S +')return url_patterns.sub(r''、text)

それでは、実際の前処理を開始して、そのための関数を作成しましょう。

from nltk.stem import WordNetLemmatizer wl = WordNetLemmatizer()def preprocessing(text):tweets = [] for statement in tqdm(text):sentence = statement.lower()#単語を小文字に変換するsentence = url_remover(sentence)#文からURLを削除するsentence=re.sub(r'@ w +'、''、sentence).strip()#単語の削除は「@」で始まりますsentence = re.sub( "[^ a-zA-Z0 -9'] "、" "、sentence)#記号の削除sentence = statement.split()sentence1 = [wl.lemmatize(word)for word in statement if word not in set(stopwords.words("english "))]ツイートからの#lemmatizationとstopwrdsの削除sentence1="" .join(sentence1)tweets.append(sentence1)returntweetstweets = preprocessing(X)

今のところ、不要な記号のストップワードを削除し、それを補題しました。 モデルにフィードする前に、これらすべてのツイートを数値の特徴に変換する必要があります。 したがって、onehotエンコーディングを実行する必要があります。 その前に、テンソルフローライブラリとそのパーツをインポートしています

from tensorflow.keras.layers import(Embedding、LSTM、Dense、Dropout、GlobalMaxPool1D、BatchNormalization)from tensorflow.keras.models import Sequential from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras.preprocessing.text import one_hot

ワンホットエンコーディングを実行しています

VOC_SIZE = 30000 onehot_vector = [ツイート内の単語の場合はone_hot(words、VOC_SIZE)] onehot_vector [110:120]

ツイートごとにそれぞれの単語の長さを見つけましょう。

word_length = [] for i in onehot_vectors:word_length.append(len(i))

len(word_length)#7613


最大単語長を見つける

マックス(語長) #五

各単語の長さが異なることを知っているように、モデルは同じサイズのデータ​​を必要とするため、モデルのトレーニング中にこれが発生します。 したがって、同じ長さのシーケンスを作成するためにゼロパディングを実行しています。

SENTENCE_LENGTH = 15 Embedded_docs = pad_sequences(onehot_vectors、padding = "post"、maxlen = SENTENCE_LENGTH)embedded_docs

次は、主要な重要なステップであるモデル作成ステップです。 最初のレイヤーは、LSTMモデルに従った単語埋め込みレイヤーです。

def model():VECTOR_FEATURES = 32 lstm_model = Sequential()lstm_model.add(Embedding(VOC_SIZE、VECTOR_FEATURES、input_length = SENTENCE_LENGTH))lstm_model.add(LSTM(100、return_sequences = True))lstm_model.add(Global .add(BatchNormalization())lstm_model.add(Dropout(1))lstm_model.add(Dense(0.5、activation = "relu"))lstm_model.add(Dropout(10))lstm_model.add(Dense(0.25、activation = "sigmoid"))return lstm_model

モデルの作成とモデルの概要の取得

lstm_model = model()lstm_model.compile(optimizer = "adam"、loss = "binary_crossentropy"、metrics = ["accuracy"])lstm_model.summary()#summary
モデルの概要|NLP

モデルのトレーニング

history = lstm_model.fit(embedded_docs、y、epochs = 8、batch_size = 32)
モデルのトレーニング| NLP

次に、モデルの精度と損失のグラフをプロットして、モデルを分析しましょう。

正確さのために

plt.plot(history.history ["accuracy"])plt.xlabel( "Epochs")plt.ylabel( "Accuracy")plt.title( "Accuracy")

画像

損失について

plt.plot(history.history ["loss"])plt.xlabel( "Epochs")plt.ylabel( "Loss")plt.title( "Loss")
NLP

損失と精度のグラフから、エポックが進むにつれて損失が減少し、精度が95%以上向上することが明らかです。

将来使用するために、モデルをピクルスファイルとして保存できます。

pickle.dump(lstm_model、open( "model.pkl"、 "wb"))

この保存されたpickleファイルは、pickleを使用してWebアプリで使用するためにロードできます。

まとめ

この記事では、災害ツイート分類の実装について説明しました。 テキストの前処理とLSTMモデルの実装の背後にあるアイデアを理解できるかもしれません。 また、テキスト分析。 この記事の重要なポイントは次のとおりです。

テキスト分析 :テキストを分析して、文の構造、そこで使用されている記号、文の長さなどを見つけます。

テキストの前処理:分析されたテキストデータは、ストップワードの削除などのいくつかの前処理技術にかけられます。 レンマ化、シンボルリムーバーなど。

モデルの作成:LSTMモデルを作成し、onehotエンコーディングと単語埋め込みの後にデータをモデルに渡しました。

これはすべて、テキスト分類プロジェクトに関するものです。 ここで教えられている概念を皆さんが理解してくれることを願っています。

深く理解するために、他のデータセットで同じタイプの質問を試してください。

私とつながる LinkedInの。

この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。

スポット画像

最新のインテリジェンス

スポット画像

私たちとチャット

やあ! どんな御用でしょうか?