@Genkoder

Почему модель llama предсказывает только один класс?

Написал код для классификации текста без меток с помощью 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                 завтра нужно посмотреть рассписание           позитивный
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rPman
вставь вывод отладочной информации или в отладчике посмотри, значение result[0] в методе classify_with_tokenization

p.s. если речь идет о классификации с помощью llm instruction, это отвратительный способ, его качество будет очень низким (за исключением топовых моделей)... попробуй в системный промпт добавить примеры, чем больше тем лучше, в идеале, чтобы каждый пример использовал максимально отличный от других вариант (в твоем случае это примеры похвалы, эмоций, отношения к человеку, к товару, и т.п.)

Правильно - обучить свою модель, на базе предобученной (не думаю что тебе потребуется большая модель, даже гугловская gemma 2g подойдет), но обучающая выборка должна содержать сотни и тысячи примеров.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Wanted. Санкт-Петербург
от 80 000 до 150 000 ₽
Wanted. Санкт-Петербург
До 120 000 ₽
от 60 000 до 120 000 ₽