文書埋め込みを使用した文書の分類
この例では、文書埋め込みを使用して文書を特徴ベクトルに変換することにより、文書分類器に学習させる方法を説明します。
ほとんどの機械学習手法では、分類器に学習させるための入力として特徴ベクトルが必要です。
文書埋め込みは、文書をベクトルにマッピングします。ラベル付けされた文書ベクトルのデータ セットが与えられると、機械学習モデルに学習させてこれらの文書を分類できるようになります。
事前学習済みの文書埋め込みの読み込み
documentEmbedding関数を使用して、事前学習済みの文書埋め込み "all-MiniLM-L6-v2" を読み込みます。このモデルには、Text Analytics Toolbox™ Model for all-MiniLM-L6-v2 Network サポート パッケージが必要です。このサポート パッケージがインストールされていない場合、関数によってダウンロード用リンクが表示されます。
emb = documentEmbedding(Model="all-MiniLM-L6-v2");再現性を確保するために、関数 rng を "default" オプションと共に使用します。
rng("default");学習データの読み込み
次に、サンプル データを読み込みます。ファイル factoryReports.csv には、各イベントの説明テキストとカテゴリカル ラベルを含む工場レポートが格納されています。
filename = "factoryReports.csv"; data = readtable(filename,TextType="string"); head(data)
Description Category Urgency Resolution Cost
_____________________________________________________________________ ____________________ ________ ____________________ _____
"Items are occasionally getting stuck in the scanner spools." "Mechanical Failure" "Medium" "Readjust Machine" 45
"Loud rattling and banging sounds are coming from assembler pistons." "Mechanical Failure" "Medium" "Readjust Machine" 35
"There are cuts to the power when starting the plant." "Electronic Failure" "High" "Full Replacement" 16200
"Fried capacitors in the assembler." "Electronic Failure" "High" "Replace Components" 352
"Mixer tripped the fuses." "Electronic Failure" "Low" "Add to Watch List" 55
"Burst pipe in the constructing agent is spraying coolant." "Leak" "High" "Replace Components" 371
"A fuse is blown in the mixer." "Electronic Failure" "Low" "Replace Components" 441
"Things continue to tumble off of the belt." "Mechanical Failure" "Low" "Readjust Machine" 38
この例の目的は、Category 列のラベルによって事象を分類することです。データをクラスに分割するために、これらのラベルを categorical に変換します。
str = data.Description; labels = categorical(data.Category);
次に、データを学習区画と、検証およびテスト用のホールドアウト区画に分割します。ホールドアウトの割合を 30% に設定します。
cvp = cvpartition(labels,Holdout=0.3); idxTrain = training(cvp); idxTest = test(cvp);
学習用の区画とテスト用の区画のターゲット ラベルを取得します。
labelsTrain = labels(idxTrain,:); labelsTest = labels(idxTest,:);
文書から特徴ベクトルへの変換
工場レポートをベクトルに変換するには、embed 関数を使用します。文書に対してテキストの前処理を実行する必要はありません。
embeddedDocumentsTrain = embed(emb,str(idxTrain,:)); embeddedDocumentsTest = embed(emb,str(idxTest,:));
埋め込まれたテスト データのサイズを表示します。
size(embeddedDocumentsTest)
ans = 1×2
144 384
144 個の文書それぞれの出力は、文書全体の意味表現を与える単一の 384 要素ベクトルです。テスト セットの最初の文書の埋め込みベクトルを表示します。
embeddedDocumentsTest(1,:)
ans = 1×384
-0.0141 -0.0434 0.0271 -0.0302 -0.1098 -0.0431 -0.0311 -0.0633 0.0388 -0.0577 0.0328 -0.0112 -0.0293 -0.0755 -0.0539 0.0484 0.0798 -0.0112 -0.0152 -0.0711 -0.0854 0.0378 0.0026 0.0957 0.0080 0.0720 0.0196 0.0605 0.0109 -0.0186 0.0441 -0.0159 -0.0111 -0.0404 0.1344 -0.0472 -0.0102 0.0745 0.0056 -0.1010 0.0479 -0.0117 0.0843 -0.0471 -0.0217 0.0362 -0.0030 -0.0579 0.1073 -0.0383
埋め込みベクトルを可視化するには、t-SNE プロットを作成します。まず、tsne を使用してベクトルを 2 次元空間に埋め込みます。次に、gscatter を使用して、ラベルごとにグループ化されたテスト用の埋め込みベクトルの散布図を作成します。
Y = tsne(embeddedDocumentsTest,Distance="cosine"); gscatter(Y(:,1),Y(:,2),labelsTest) title("Factory Report Embeddings")

文書分類器の学習
fitcecoc を使用して、マルチクラス線形分類モデルに学習させます。
mdl = fitcecoc(embeddedDocumentsTrain,labelsTrain,Learners="linear")mdl =
CompactClassificationECOC
ResponseName: 'Y'
ClassNames: [Electronic Failure Leak Mechanical Failure Software Failure]
ScoreTransform: 'none'
BinaryLearners: {6×1 cell}
CodingMatrix: [4×6 double]
Properties, Methods
モデルのテスト
テスト用文書のカテゴリを予測します。精度を計算し、混同行列チャートをプロットします。
labelPredict = predict(mdl,embeddedDocumentsTest); acc = mean(labelPredict == labelsTest)
acc = 0.9444
confusionchart(labelPredict,labelsTest)

対角線上の大きな値は、対応するクラスに対する正確な予測を示しています。対角線外の大きな値は、対応するクラス間での強い混同を示しています。
参考
documentEmbedding | embed | fastTextWordEmbedding | tokenizedDocument | word2vec | readWordEmbedding | trainWordEmbedding | wordEmbedding