Написал код для классификации текста без меток с помощью llama 2 , но проблема заключается в том что ответ модели только по одной категории к каждому тексту
Пример кода и ответа:
# Приведение текста к нижнему регистру
data['Выражения'] = data['Выражения'].str.lower()
# Очистка текста от лишних символов и пробелов
def clean_text(text):
if isinstance(text, str):
text = re.sub(r'<.*?>', '', text) # Удаление HTML-тегов
text = re.sub(r'[^а-яА-Яa-zA-Z0-9\s]', '', text) # Удаление лишних символов
text = re.sub(r'\s+', ' ', text).strip() # Удаление лишних пробелов
return text
return ''
# Применяем очистку текста к DataFrame
data['Выражения'] = data['Выражения'].apply(clean_text)
# Инициализация модели LLaMA 2 и токенизатора
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = LlamaForCausalLM.from_pretrained(model_path)
# Инициализация пайплайна генерации текста с использованием модели LLaMA 2
generator = pipeline("text-generation", model=model, tokenizer=tokenizer)
# Определяем возможные классы
#candidate_labels = ['позитивный', 'негативный', 'несодержательно', 'медицина', 'еда']
# Устанавливаем лимит токенов для модели и порог для второго класса
token_limit = 4000 # Максимальное количество токенов за раз
# Функция для генерации промпта
def generate_prompt(text):
prompt = (
f"Классифицируй следующий текст по категориям: 'позитивный', 'негативный', 'несодержательно', 'медицина','еда'. "
f"Ответь только одной категорией без дополнительных слов: "
f"'{text}'"
)
return prompt
# Функция классификации текста с учетом токенизации
def classify_with_tokenization(text):
results = []
start = 0
end = token_limit
while start < len(text):
tokens = tokenizer(text[start:end], truncation=True, max_length=token_limit, return_tensors="pt")
prompt = generate_prompt(tokenizer.decode(tokens.input_ids[0], skip_special_tokens=True))
try:
result = generator(prompt, max_new_tokens=2, num_return_sequences=1, do_sample=False)
classification = result[0]['generated_text'].strip()
# Извлекаем только одну категорию
match = re.search(r"(позитивный|негативный|несодержательно|медицина|еда)", classification)
if match:
results.append(match.group(0))
else:
results.append("Не удалось классифицировать")
except Exception as e:
results.append(f"Ошибка: {str(e)}")
start += token_limit
end += token_limit
return ' '.join(results)
# Применение классификации
data['Предсказанные классы'] = data['Выражения'].apply(classify_with_tokenization)
# Вывод результата
print(data[['Выражения', 'Предсказанные классы']])
Выражения Предсказанные классы
0 сегодня хороша погода поэтому надо пойти погулять позитивный
1 сегодня плохая погода поэтому буду сегодня цел... позитивный
2 врач очень любезный и понимающий позитивный
3 эти врачи ничего не понимают в медицине позитивный
4 я очень людлю гулять в хорошу погоду позитивный
5 в этом магазине очень мало ассоримента позитивный
6 этот ресторан очень плохо кормят позитивный
7 это кафешка одна из лучших что я помню позитивный
8 завтра нужно посмотреть рассписание позитивный