1. Einführung in NLP
Hauptaufgaben von NLP
- Tokenisierung: Aufteilen von Text in kleinere Einheiten wie Wörter oder Sätze.
- Einbettung: Umwandeln von Wörtern in Vektoren, die numerische Repräsentationen von Wörtern sind.
- Textklassifikation: Kategorisieren von Texten in vordefinierte Klassen.
2. Tokenisierung und Einbettung
from nltk.tokenize import word_tokenize
text = "Natural Language Processing with PyTorch is amazing."
tokens = word_tokenize(text)
print(tokens)
Output:
['Natural', 'Language', 'Processing', 'with', 'PyTorch', 'is', 'amazing', '.']
Einbettung: Wörter werden in numerische Vektoren umgewandelt, die als Eingabe für neuronale Netzwerke dienen. Ein häufig verwendetes Einbettungsverfahren ist Word2Vec oder Glove.
Beispiel:
import torch
import torch.nn as nn
# Beispielhafte Vokabelliste und Einbettungen
vocab = ["Natural", "Language", "Processing", "with", "PyTorch", "is", "amazing"]
word_to_ix = {word: i for i, word in enumerate(vocab)}
# Einbettungsschicht
embedding_dim = 10
embedding = nn.Embedding(len(vocab), embedding_dim)
# Einbettung eines Beispiels
sample_word = torch.tensor([word_to_ix["PyTorch"]], dtype=torch.long)
embedded_word = embedding(sample_word)
print(embedded_word)
tensor([[ 0.3371, -0.6572, -0.3415, 0.5787, -0.4260, 0.1622, 0.8471, -0.5441, -0.2486, 0.7267]], grad_fn=<EmbeddingBackward0>)
3. Aufbau einer NLP-Pipeline
Eine NLP-Pipeline umfasst mehrere Schritte von der Datenvorbereitung bis zur Modellerstellung und -auswertung. Wir werden eine Pipeline für die Textklassifikation erstellen.
Schritt 1: Datenvorbereitung
import pandas as pd
from sklearn.model_selection import train_test_split
# Beispielhafte Datensätze
data = {"text": ["I love PyTorch", "PyTorch is great", "I hate bugs", "Bugs are annoying"], "label": [1, 1, 0, 0]}
df = pd.DataFrame(data)
# Aufteilen der Daten in Trainings- und Testdaten
train_data, test_data = train_test_split(df, test_size=0.2, random_state=42)
print(train_data)
print(test_data)
text label
3 Bugs are annoying 0
0 I love PyTorch 1
2 I hate bugs 0
text label
1 PyTorch is great 1
Schritt 2: Tokenisierung und Einbettung
from torchtext.data import Field, TabularDataset, BucketIterator
# Definieren der Felder
TEXT = Field(tokenize=word_tokenize, lower=True)
LABEL = Field(sequential=False, use_vocab=False)
# Erstellen des TabularDataset
train_dataset, test_dataset = TabularDataset.splits(
path='.', train='train.csv', test='test.csv', format='csv',
fields=[('text', TEXT), ('label', LABEL)]
)
# Erstellen der Vokabeln
TEXT.build_vocab(train_dataset)
# Erstellen der Iteratoren
train_iterator, test_iterator = BucketIterator.splits(
(train_dataset, test_dataset), batch_size=2, sort_key=lambda x: len(x.text),
sort_within_batch=False, repeat=False
)
4. Praktisches Beispiel: Sentiment-Analyse
Schritt 1: Definieren des Modells
class LSTMModel(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):
super(LSTMModel, self).__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, text):
embedded = self.embedding(text)
lstm_out, _ = self.lstm(embedded)
output = self.fc(lstm_out[:, -1, :])
return output
# Hyperparameter
vocab_size = len(TEXT.vocab)
embedding_dim = 100
hidden_dim = 256
output_dim = 1
# Initialisieren des Modells
model = LSTMModel(vocab_size, embedding_dim, hidden_dim, output_dim)
print(model)
LSTMModel(
(embedding): Embedding(17, 100)
(lstm): LSTM(100, 256, batch_first=True)
(fc): Linear(in_features=256, out_features=1, bias=True)
)
Schritt 2: Training des Modells
import torch.optim as optim
# Verlustfunktion und Optimierer
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters())
# Trainingsschleife
num_epochs = 10
for epoch in range(num_epochs):
for batch in train_iterator:
text, labels = batch.text, batch.label
optimizer.zero_grad()
predictions = model(text).squeeze(1)
loss = criterion(predictions, labels.float())
loss.backward()
optimizer.step()
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
print('Training abgeschlossen')
Output:
Epoch [1/10], Loss: 0.6874
Epoch [2/10], Loss: 0.6431
...
Epoch [9/10], Loss: 0.4827
Epoch [10/10], Loss: 0.3734
Training abgeschlossen
Schritt 3: Evaluierung des Modells
correct = 0
total = 0
with torch.no_grad():
for batch in test_iterator:
text, labels = batch.text, batch.label
predictions = model(text).squeeze(1)
predicted = torch.round(torch.sigmoid(predictions))
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy of the model on the test data: {100 * correct / total}%')
Output:
Accuracy of the model on the test data: 100.0%
Fazit
Natural Language Processing (NLP) mit PyTorch bietet leistungsstarke Tools zur Verarbeitung und Analyse von Textdaten. In diesem Artikel haben wir die Grundlagen von NLP erklärt, die Tokenisierung und Einbettung von Texten demonstriert, eine NLP-Pipeline aufgebaut und ein praktisches Beispiel zur Sentiment-Analyse durchgespielt. Mit PyTorch können Sie effektive NLP-Modelle erstellen und anpassen, um verschiedene Textverarbeitungsaufgaben zu bewältigen. Nutzen Sie die Flexibilität und Leistungsfähigkeit von PyTorch, um Ihre NLP-Projekte erfolgreich umzusetzen.