序文
感情分析は自然言語処理の一部であり、そのタスクは、テキストが与えられたときに、テキストによって表現された感情がポジティブ、ニュートラル、またはネガティブであるかどうかを判断することです。これは広く使用されています:
1。製品の賞賛の自動検出。
2. WeiboやTwitterなどのプラットフォームのユーザーが、喜んで賞賛したり、批判したり、不平を言ったりするかどうか。
今回は、機械学習を使用して感情分析の実際の戦いを行う方法を紹介します。
注:今回は、詳細な機械学習アルゴリズムではなく、実際の機械学習のプロセスに焦点を当てます。それを体験したい初心者にとってはよりフレンドリーになります。また、初心者の方は、完全なプロセスを体験して時間がかかることを理解するのが普通なので、焦らないでください。
関連データ
私たちのデータは、ユーザーがTwitterで送信したツイートです。私たちのタスクは、Twitterのスピーチが見られなかった場合に、それが幸せな賞賛(positive
)、批判または苦情(negative
)、または中立(neutral
)であるかどうかを判断するモデルをトレーニングすることです。前に。。たとえば、与えられた“bullying me”
(いじめっ子)とすると、モデルはを出力できる必要があります“negative”
。
今回のデータはgithubにアップロードされています。この実際の戦闘train.csv
でのみファイルを使用しました。
実際の戦闘
1.関連するパッケージとモデルをインポートします。
import pandas as pd
import numpy as np
#将train.csv划分训练集和测试集
from sklearn.model_selection import train_test_split
#将文本变成向量,这是自然语言处理的常用技术
from sklearn.feature_extraction.text import TfidfVectorizer
#逻辑回归模型
from sklearn.linear_model import LogisticRegression
#支持向量机
from sklearn.svm import LinearSVC
#朴素贝叶斯
from sklearn.naive_bayes import MultinomialNB
#训练完成后,对模型的评价
from sklearn.metrics import accuracy_score,classification_report
#对于上面的包,你只需要会pandas和numpy两个包,其他不会不要紧,如果连pandas和numpy都不会,要么先去学(比较建议),要么看下去不懂再查。
2.データを読み取ります。ここでのパスは、データが配置されているパスに変更する必要があります。
data=pd.read_csv("data/tweet-sentiment-extraction/train.csv")
data.head(5)
3.モデルの入力と出力を作成します。簡単にするために、入力にはselected_textを選択し、出力のラベルとして感情を選択します。他の2つの列は必要ありません。
datax=data["selected_text"]
datay=data["sentiment"]
print(datax.shape)
print(datay.shape)
4.#トレーニングセットとテストセットを分割します。テストセットは、モデルまたはハイパーパラメータを選択するために使用されます。トレーニングデータセットが検証テストセットにどのように分割されているかを参照できますか?
trainx,testx,trainy,testy=train_test_split(datax,datay,test_size=0.3,random_state=42)
print(trainx.shape)
print(testx.shape)
random_state
用途はどれですか?sklearnのtrain_test_split関数でrandom_stateがどのように使用されているかを参照できますか?
5.不足している値を処理します。以下は扱いが少し面倒です。あまり理解していなくても大丈夫です。一般的なプロセスを見て練習してください。詳細については、DataFrameに欠落している値NoneまたはNaN(nan)があるかどうかを判断する方法を参照してください。
#查看是否有缺失值
trainx.isnull().any()
欠落している値の位置を見つけて、固定文字列(スペースや「#」など)で埋めるか、直接削除することができます。
#可以得到是否为空得true,false的同样shape的dataframe or series。
boolx=trainx.isnull()
#改成数值型,否则numpy无法处理。
boolx[boolx==True]=1
boolx
#必须要先将dataframe或者series转化成ndarray,否则argwhere会报错。
boolxn=np.array(boolx)
np.argwhere(boolxn==1)
#由于随机状态固定了,所以分配的训练集和测试集每次都是那样的,即每一次索引都是13791。但是这个是顺序的那个索引,我们应该得到真正的index.
sindex=trainx.index
sindex[13791]
#为了追究data中到底是什么,我们得到了其索引是314,由于这个是从0开始的,所以索引和iloc都是一样的。
data.iloc[314,:]
何も言わないトレーニングデータがNaN
あり、感情分析はニュートラルとしてマークされていることがわかりました。
#这里我需要给一个暗号,为了便于处理,将空值一律替换成空格或者#都可以。
trainx.iloc[13791]="#"
trainx.iloc[13791]
6.テキストtrainxをベクトル化します。sklearnでTfidfVectorizerを使用する例を参照できます。
#下面将文本trainx给向量化。
tv=TfidfVectorizer(stop_words="english",ngram_range=(1,1),max_df=0.8,min_df=2)
tv_fit=tv.fit_transform(trainx)
#从此,trainx变成了tv_fit的toarray,也就是说已经变成了向量。
trainxv=tv_fit.toarray()
trainxv
trainxv.shape
同様に、testxもベクトルに変換する必要があります。tv
新しいテレビではなく、上記で行われたテレビに変換されることに注意してください。そうでない場合、testxvに記録されたディメンションはtrainxvとは異なる可能性があり、5072ではない可能性があり、trainxvトレーニングモデルに基づいています(5072ディメンションのみが受け入れられます) 、testxvを使用して実行します。テストを検証するとき、入力は間違いなく入力されていません。
testxv=tv.transform(testx)
testxv
#下面显示是稀疏矩阵,压缩存储了,我真是笑了,我觉得这个说明了一个问题,这个testx里面有很多生词,这样不太好啊,因为感觉预测效果将不会太好。
7.モデルのトレーニング。
#由于我们要用很多个机器学习模型来分类,而且都有一个共同点,都是fit,predict,所以干脆写成一个函数。
def train_model(model_name,model,trainx,trainy,testx,testy):
print("this is the model of",model_name)
model.fit(trainx,trainy)
trainy_pred=model.predict(trainx)
testy_pred=model.predict(testx)
print("accuracy on training data:",accuracy_score(trainy,trainy_pred))
print("accuracy on testing data:",accuracy_score(testy,testy_pred))
print("classification report on testing data:")
print(classification_report(testy,testy_pred))
#使用逻辑回归模型,
import warnings
warnings.filterwarnings("ignore")
model_lr=LogisticRegression()
train_model("logistic regression",model_lr,trainxv,trainy,testxv,testy)
#使用支持向量机模型来进行分类。
model_svm=LinearSVC()
train_model("support vector machine",model_svm,trainxv,trainy,testxv,testy)
#使用朴素贝叶斯模型来分类。
model_nb=MultinomialNB()
train_model("naive bayes",model_nb,trainxv,trainy,testxv,testy)
上記のトレーニングには3つのモデルを使用しました。最終的な選択については、テストセットで正しいレートを確認するか、加重テストセットとトレーニングセット(2で加算および除算など)を使用して最終モデルを選択します。
終わり
個人的には、この記事を注意深く理解することをお勧めします。それほど長くはなく、それほど難しいことではありませんが、少しずつ蓄積されます。私ははっきりと何かを書いていませんでした、ただ質問をしてください。