Text classification на собеседовании Data Scientist

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем разбирать на собесе

Text classification — типовая NLP задача. На собесе DS: «sentiment analysis», «spam detection».

Pipeline classic

text → preprocessing → features → classifier → label

Preprocessing:

  • Lowercase.
  • Remove punctuation / digits / stopwords (если нужно).
  • Stemming / lemmatization.
  • Tokenization.

В современных DL — preprocessing minimal (BERT handles).

TF-IDF + linear model

Самый baseline.

TF-IDF. Term Frequency × Inverse Document Frequency.

tf(t, d) = count of t in d
idf(t) = log(N / (1 + docs containing t))
tfidf(t, d) = tf × idf

Common слова weighted lower. Distinguishing words — higher.

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline

pipe = Pipeline([
    ('tfidf', TfidfVectorizer(ngram_range=(1, 2))),
    ('clf', LogisticRegression())
])

Быстро, дешёво. Часто 80-90% качества BERT с 1% cost.

BERT fine-tune

from transformers import BertForSequenceClassification, Trainer

model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
trainer = Trainer(model=model, ..., train_dataset=ds)
trainer.train()

Pros: SOTA качество. Понимает context, синонимы.

Cons: GPU, slower inference, higher cost.

Variants:

  • DistilBERT — 40% меньше, 60% быстрее.
  • RoBERTa, DeBERTa — лучше BERT.
  • ruBERT для русского.
Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Sentence embeddings + classifier

text → sentence-transformer → embedding → simple classifier (LR / NN)
from sentence_transformers import SentenceTransformer
encoder = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = encoder.encode(texts)
LogisticRegression().fit(embeddings, labels)

Compromise:

  • Качество близко к BERT fine-tune.
  • Inference faster — encoder один раз, LR cheap.
  • Модель меньше памяти.

Когда что

TF-IDF + LR:

  • Маленькие dataset (< 10k).
  • Нужна interpretability (feature importances).
  • Lowest cost.

BERT fine-tune:

  • Хорошее качество, есть GPU.
  • Domain-specific (юридические тексты, медицина).

Sentence embeddings + classifier:

  • Compromise quality / cost.
  • Multiple downstream tasks (один encoder).

LLM zero-shot.

Prompt: "Classify this review sentiment: {text}\nLabel: positive/negative/neutral"

GPT / Claude — хорошо без training. Но cost / latency высокие.

Связанные темы

FAQ

Это официальная информация?

Нет. Статья основана на стандартных NLP подходах.


Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.