nlp - Doğal Dil İşleme
BERT, Tokenizer, NER ve metin analizi araçları
BERT
Embeddings
5
Tokenizer
NER
Entity
Multilang
Destek
Genel Bakış
nlp modülü, metin işleme, embeddings, named entity recognition ve sentiment analysis için araçlar sağlar.
Tokenization
BPE Tokenizer
kullan ai/nlp;
// Pre-trained tokenizer yükle
değişken tokenizer = Tokenizer::yükle("bert-base-uncased")?;
değişken text = "BERK programlama dili çok güçlü!";
değişken tokens = tokenizer.encode(text);
yazdir("Tokens: {:?}", tokens.ids);
yazdir("Token texts: {:?}", tokens.tokens);
// Decode
değişken decoded = tokenizer.decode(tokens.ids);
yazdir("Decoded: {}", decoded);
Custom Tokenizer
kullan ai/nlp;
// Kendi tokenizer'ınızı eğitin
değişken trainer = TokenizerTrainer::yeni(
vocab_size: 30000,
special_tokens: ["[PAD]", "[UNK]", "[CLS]", "[SEP]", "[MASK]"]
);
// Corpus üzerinde eğit
değişken corpus = [
"BERK dili sistem programlama için idealdir.",
"Rust'tan ilham alınmış modern bir dildir.",
// ...
];
değişken tokenizer = trainer.train(corpus)?;
tokenizer.save("tokenizer.json")?;
BERT Embeddings
Sentence Embeddings
kullan ai/nlp;
// BERT model yükle
değişken bert = BERT::yükle(
model: "bert-base-multilingual-cased",
device: "cuda"
)?;
değişken sentences = [
"BERK programlama dili",
"Rust benzeri syntax",
"Modern ve güvenli"
];
// Embeddings al
değişken embeddings = bert.encode(sentences)?;
yazdir("Shape: {:?}", embeddings.shape()); // [3, 768]
// Similarity hesapla
değişken sim_01 = cosine_similarity(embeddings[0], embeddings[1]);
yazdir("Benzerlik: {:.4f}", sim_01);
Fine-tuning BERT
kullan ai/nlp;
kullan ai/nn;
kullan ai/optim;
// BERT + Classification head
sınıf SentimentClassifier {
değişken bert: BERT;
değişken classifier: Linear;
fonksiyon yeni(num_classes: tamsayı) -> SentimentClassifier yap
değişken bert = BERT::yükle("bert-base-uncased")?;
değişken classifier = Linear::yeni(768, num_classes);
dön SentimentClassifier { bert, classifier };
son
fonksiyon ileri(değişken kendi, input_ids: Tensor) -> Tensor yap
değişken bert_output = kendi.bert.ileri(input_ids);
değişken cls_token = bert_output[:, 0, :]; // [CLS] token
dön kendi.classifier.ileri(cls_token);
son
}
// Eğitim
değişken model = SentimentClassifier::yeni(num_classes: 3);
değişken optimizer = AdamW::yeni(model.parametreler(), lr: 2e-5);
her epoch içinde aralık(3) için yap
her batch içinde train_loader için yap
değişken logits = model.ileri(batch.input_ids);
değişken loss = cross_entropy(logits, batch.labels);
optimizer.sıfırla();
loss.geri();
optimizer.adım();
son
son
Named Entity Recognition (NER)
Entity Detection
kullan ai/nlp;
// Pre-trained NER model
değişken ner = NER::yükle("bert-base-ner")?;
değişken text = "Ahmet Ankara'da Microsoft'ta çalışıyor.";
değişken entities = ner.predict(text)?;
her entity içinde entities için yap
yazdir!("{}: {} ({})",
entity.text,
entity.label,
entity.confidence);
son
// Çıktı:
// Ahmet: PERSON (0.98)
// Ankara: LOCATION (0.95)
// Microsoft: ORGANIZATION (0.97)
Custom NER Training
kullan ai/nlp;
// NER model tanımla
değişken model = NER::yeni(
base_model: "bert-base-cased",
labels: ["O", "B-PER", "I-PER", "B-LOC", "I-LOC", "B-ORG", "I-ORG"]
);
// Training data
değişken train_data = [
NERExample {
text: "John lives in New York",
labels: ["B-PER", "O", "O", "B-LOC", "I-LOC"]
},
// ...
];
// Eğit
değişken trainer = NERTrainer::yeni(model, optimizer);
trainer.train(train_data, epochs: 5)?;
Sentiment Analysis
Duygu Analizi
kullan ai/nlp;
değişken analyzer = SentimentAnalyzer::yükle("tr-sentiment")?;
değişken reviews = [
"Bu ürün harika, çok beğendim!",
"Berbat bir deneyim, tavsiye etmem.",
"Fena değil, idare eder."
];
her review içinde reviews için yap
değişken sentiment = analyzer.predict(review)?;
yazdir!("{}: {} (güven: {:.2f})",
review,
sentiment.label, // "Pozitif", "Negatif", "Nötr"
sentiment.score);
son
Text Generation
GPT-style Generation
kullan ai/nlp;
değişken generator = TextGenerator::yükle("gpt2-turkish")?;
değişken prompt = "BERK programlama dili";
değişken generated = generator.generate(
prompt: prompt,
max_length: 100,
temperature: 0.8,
top_k: 50,
top_p: 0.95,
num_return_sequences: 3
)?;
her (i, text) içinde generated.enumerate() için yap
yazdir!("Varyasyon {}: {}", i+1, text);
son
Beam Search
kullan ai/nlp;
değişken generated = generator.generate(
prompt: "Derin öğrenme",
max_length: 50,
num_beams: 5, // Beam search
early_stopping: doğru,
no_repeat_ngram_size: 3
)?;
yazdir("{}", generated);
Question Answering
Extractive QA
kullan ai/nlp;
değişken qa_model = QA::yükle("bert-large-qa")?;
değişken context = "BERK, Rust'tan ilham alan modern bir sistem programlama dilidir. \
Bellek güvenliği ve performans odaklı tasarlanmıştır.";
değişken question = "BERK hangi dilden ilham alır?";
değişken answer = qa_model.predict(
question: question,
context: context
)?;
yazdir("Cevap: {}", answer.text); // "Rust"
yazdir("Güven: {:.2f}", answer.score); // 0.95
yazdir("Span: {:?}", answer.span); // (6, 10)
Text Classification
Multi-label Classification
kullan ai/nlp;
değişken classifier = TextClassifier::yeni(
base_model: "bert-base-uncased",
labels: ["teknoloji", "spor", "politika", "ekonomi"],
multi_label: doğru
);
değişken text = "Apple yeni iPhone modelini tanıttı. Hisse fiyatları yükseldi.";
değişken predictions = classifier.predict(text)?;
her pred içinde predictions için yap
eğer pred.score > 0.5 ise yap
yazdir!("{}: {:.2f}", pred.label, pred.score);
son
son
// Çıktı:
// teknoloji: 0.92
// ekonomi: 0.78
Language Detection
Dil Tespiti
kullan ai/nlp;
değişken detector = LanguageDetector::yeni();
değişken texts = [
"Bu bir Türkçe cümledir.",
"This is an English sentence.",
"Dies ist ein deutscher Satz.",
"これは日本語の文です。"
];
her text içinde texts için yap
değişken lang = detector.detect(text)?;
yazdir!("{}: {}", lang.code, text);
son
Text Preprocessing
Temizleme ve Normalizasyon
kullan ai/nlp;
değişken processor = TextProcessor::yeni();
// Pipeline oluştur
processor
.lowercase()
.remove_punctuation()
.remove_stopwords(lang: "tr")
.stem(algorithm: "snowball")
.remove_urls()
.remove_emails();
değişken text = "BERK'i https://berk-lang.org adresinden indirebilirsiniz! İletişim: info@berk.com";
değişken cleaned = processor.process(text);
yazdir!("{}", cleaned);
// Çıktı: "berk adres indir iletisim"
Word Embeddings
Word2Vec & FastText
kullan ai/nlp;
// Pre-trained embeddings yükle
değişken w2v = Word2Vec::yükle("fasttext-tr-300d")?;
// Kelime vektörü al
değişken vec = w2v.get_vector("bilgisayar")?;
yazdir!("Vektör boyutu: {}", vec.len()); // 300
// En yakın kelimeler
değişken similar = w2v.most_similar("programlama", top_k: 5)?;
her (word, similarity) içinde similar için yap
yazdir!("{}: {:.4f}", word, similarity);
son
// Analoji: kral - erkek + kadın = ?
değişken result = w2v.analogy("kral", "erkek", "kadın")?;
yazdir!("Analoji sonucu: {}", result); // "kraliçe"
Performans Metrikleri
| Model | Parametreler | Inference (ms) | Kullanım |
|---|---|---|---|
| BERT-base | 110M | ~40 | Genel amaçlı NLP |
| BERT-large | 340M | ~140 | Yüksek doğruluk |
| DistilBERT | 66M | ~20 | Hızlı inference |
| RoBERTa | 125M | ~45 | SOTA performans |
| GPT-2 small | 117M | ~50 | Text generation |
| T5-base | 220M | ~80 | Seq2seq tasks |
API Referansı
Tokenizer Sınıfı
yükle(model: dizgi) -> Tokenizer- Pre-trained tokenizerencode(text: dizgi) -> Encoding- Text'i tokenize etdecode(ids: [tamsayı]) -> dizgi- Token ID'leri decode etencode_batch(texts: [dizgi]) -> [Encoding]- Batch encoding
BERT Sınıfı
yükle(model: dizgi, ...) -> BERT- BERT model yükleencode(texts: [dizgi]) -> Tensor- Sentence embeddingsileri(input_ids: Tensor) -> BertOutput- Forward pass
NER Sınıfı
yükle(model: dizgi) -> NER- NER model yüklepredict(text: dizgi) -> [Entity]- Entity detectionpredict_batch(texts: [dizgi]) -> [[Entity]]