0 Pluspunkte 0 Minuspunkte

Ich habe diesen Code der Texte in positive und negative Sätze klassifizieren kann.

import tensorflow as tf
from tensorflow import keras
import numpy as np
import sys

positive_sentences = [...]
negative_sentences = [...]

positive_labels = np.ones(len(positive_sentences))
negative_labels = np.zeros(len(negative_sentences))

sentences = positive_sentences + negative_sentences
labels = np.concatenate([positive_labels, negative_labels])

tokenizer = keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(sentences)

word_index = tokenizer.word_index
sequences = tokenizer.texts_to_sequences(sentences)
padded_sequences = keras.preprocessing.sequence.pad_sequences(sequences)

model = keras.models.Sequential([
    keras.layers.Embedding(len(word_index) + 1, 16, input_length=padded_sequences.shape[1]),
    keras.layers.GlobalAveragePooling1D(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(padded_sequences, labels, epochs=1000, verbose=1)

Wie kann ich dieses Model erweitern so das es mehrere Kategorien von Sätzen erkennen kann. Ich möchte z.B einen Support Bot erkennen der den Text in verschiedene Problemstellungen (z.B Netzwerk, Virtualisierung, Backup, Storage) unterteilen kann.

bezieht sich auf eine Antwort auf: Text Klassifizierung mit Tensorflow
von (396 Punkte)  

2 Antworten

0 Pluspunkte 0 Minuspunkte

Zuerst erstellst du eine Liste für jede Kategorie die du klassifizieren möchtest.

netzwerk = [...]
virtualisierung [...]
backup = [...]
storage = [...]

Dann erstellst du die Labels für jede Liste. 0 = Netzwerk, 1 = Virtualisierung, 3 = Backup, ...

netzwerk_labels = np.zeroes(len(netzwerk))
virtualisierung_labels = np.ones(len(virtualisierung))
backup_labels = np.fill(len(backup), 3)
storage_labels = np.fill(len(storage), 4)

Als Loss Funktion ersetzt du "binary_crossentropy" durch "sparse_categorical_crossentropy" um mehrere Kategorien zu unterstützen.

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

Den letzten Layer musst anpassen so das er 4 Zahlen als Ergebnis liefert damit du für jede mögliche Kategorie einen Wahrscheinlichkeitswert erhältst. Ausserdem habe ich die Aktivierungsfunktion von "sigmoid" zu "softmax" geändert. Softmax bildet eine sanftere Kurve als Sigmoid.

model = keras.models.Sequential([
    keras.layers.Embedding(len(word_index) + 1, 16, input_length=padded_sequences.shape[1]),
    keras.layers.GlobalAveragePooling1D(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(4, activation='softmax')
])

Mit diesen Änderungen sollte das Modell in der Lage sein deine Texte entsprechend zu klassifizieren.

von (716 Punkte)  
0 Pluspunkte 0 Minuspunkte

Das könntest auch die Huggingface API nutzen.

import sys
from huggingface_hub.inference_api import InferenceApi

inference = InferenceApi(repo_id="typeform/distilbert-base-uncased-mnli", token="hf_xxxxxxx") # Dein API Token
inputs = "My internet is slow?"
params = {"candidate_labels":["network", "virtualization", "backup"]}
result = inference(inputs, params)

von