| | --- |
| | library_name: transformers |
| | datasets: |
| | - cardiffnlp/tweet_eval |
| | language: |
| | - en |
| | metrics: |
| | - f1 |
| | base_model: |
| | - TinyLlama/TinyLlama-1.1B-Chat-v1.0 |
| | --- |
| | # О модели |
| | Модель TinyLlama/TinyLlama-1.1B-Chat-v1.0, дообученная с помощью библиотеки PEFT адаптером QLoRA, предназначена для оценки тональности сообщений пользователей. Дообучена на датасете "cardiffnlp/tweet_eval", определяя тональность твитов. |
| | # Результат после дообучения |
| | Результат после дообучения: macro F1: 0.53 |
| | # Как использовать |
| | Хоть модель и обучалась определять тональность твитов, она вполне способна и определять тональность обычных сообщений/текстов |
| | |
| | ```python |
| | if torch.cuda.is_available(): |
| | DEVICE = "cuda" |
| | elif torch.backends.mps.is_available(): |
| | DEVICE = "mps" |
| | else: |
| | DEVICE = "cpu" |
| | model = AutoModelForCausalLM.from_pretrained(f"{REPO_NAME}-tinyllama-qlora", device_map="cuda") |
| | tokenizer = AutoTokenizer.from_pretrained(f"{REPO_NAME}-tinyllama-qlora") |
| | tokenizer.pad_token = tokenizer.eos_token |
| | tokenizer.padding_side = "left" |
| | |
| | IDX2NAME = {0: "negative", 1: "neutral", 2: "positive"} |
| | def postprocess_sentiment(output_text: str) -> str: |
| | """ |
| | Фильтрует вывод модели и возвращает только метку класса, к которому относится сообщение ('positive', 'negative', 'neutral'). |
| | Parameters: |
| | output_text (str): Текст, сгенерированный моделью. |
| | |
| | Returns: |
| | str: тональность текста или пустая строка |
| | """ |
| | |
| | parts = output_text.split("assistant", 1) |
| | text_to_process = parts[1] if len(parts) > 1 else output_text |
| | |
| | match = re.search(rf"\b({'|'.join(IDX2NAME.values())})\b", text_to_process, re.IGNORECASE) |
| | return match.group(1).lower() if match else "" |
| | SYSTEM_PROMPT = "Your task is to look through the provided text and classify the sentiment of it. Possible classes are: positive, negative, neutral. Respond only one word from the possible classes that best describes the sentiment of provided text." |
| | text = 'I hate playing Minecraft' #здесь может быть ваш текст |
| | chat = [ |
| | {'role': 'system', 'content' : SYSTEM_PROMPT}, |
| | {'role': 'user', 'content' : f"Text to classify: {text}"} |
| | ] |
| | ch_temp = tokenizer.apply_chat_template(chat, tokenize = False) |
| | input_ids = tokenizer(ch_temp, return_tensors = 'pt').to(model.device) |
| | output_ids = model.generate(input_ids['input_ids'], max_new_tokens=16) |
| | generated_text = tokenizer.decode(output_ids[0][len(input_ids[0]) :], skip_special_tokens=True) |
| | print(generated_text) |
| | ``` |
| | # Примеры использования |
| | |
| | <div style=" |
| | background: #1a2639; |
| | padding: 14px; |
| | border-radius: 6px; |
| | border-left: 3px solid #3a86ff; |
| | color: #e0e0e0; |
| | font-family: 'Consolas', monospace; |
| | margin: 16px 0; |
| | "> |
| | <b>Промт:</b> "I hate morning" |
| |
|
| | <b>Ответ модели:</b> |
| | negative |
| |
|
| | <b>Промт:</b> "I love playing videogames" |
| |
|
| | <b>Ответ модели:</b> |
| | positive |
| |
|
| | <b>Промт:</b> "It is raining today" |
| |
|
| | <b>Ответ модели:</b> |
| | neutral |
| | </div> |