pip install numpy==1.24.2 pandas==2.0.0 tqdm==4.65.0 openai==0.27.4 tiktoken==0.3.3 plotly==5.14.1
import openai
import tiktoken
import numpy as np
import pandas as pd
from os import environ
from tqdm import tqdm
from openai.embeddings_utils import get_embedding
openai.api_key = environ.get('OPENAI_TOKEN')
tqdm.pandas()
df = pd.read_csv('../data/appeals.csv')
df
df['class'].value_counts()
#
# Результаты анализов 36
# Изменение времени приема 25
# Пластическая хирургия 25
# Запись на прием 18
# Справки 14
embedding_model = "text-embedding-ada-002"
embedding_encoding = "cl100k_base"
max_tokens = 100 # Задаем максимальную длину токенов для сообщения
encoding = tiktoken.get_encoding(embedding_encoding)
# Рассчитываем длину сообщений в токенах
df["n_tokens"] = df['message'].apply(lambda x: len(encoding.encode(x)))
print(f"Потратим: ${df['n_tokens'].sum() * 0.0004 / 1000}")
# Потратим: $0.0011896
df = df[df["n_tokens"] <= max_tokens]
df["embedding"] = df['message'].progress_apply(lambda x: get_embedding(x, engine=embedding_model)),
# 100%|██████████| 118/118 [01:04<00:00, 1.82it/s]
matrix = np.vstack(df['embedding'].values)
matrix.shape
# (118, 1536)
from sklearn.cluster import KMeans
n_clusters = 5 # Кол-во кластеров можно менять по усмотрению
kmeans = KMeans(n_clusters=n_clusters, init="k-means++", random_state=42)
kmeans.fit(matrix)
labels = kmeans.labels_
df["сluster"] = labels
from sklearn.manifold import TSNE
import matplotlib
import matplotlib.pyplot as plt
tsne = TSNE(n_components=2, perplexity=15, random_state=42, init="random", learning_rate=200)
vis_dims2 = tsne.fit_transform(matrix)
x = [x for x, y in vis_dims2]
y = [y for x, y in vis_dims2]
for category, color in enumerate(["purple", "green", "red", "blue", "yellow"]):
xs = np.array(x)[df.сluster == category]
ys = np.array(y)[df.сluster == category]
plt.scatter(xs, ys, color=color, alpha=0.3)
avg_x = xs.mean()
avg_y = ys.mean()
plt.scatter(avg_x, avg_y, marker="x", color=color, s=100)
plt.title("Отображение кластеров в 2d используя t-SNE")
msg_per_cluster = 5 # Количество сообщений на кластер
for i in range(n_clusters):
joined_messages = "\n".join(
df[df['сluster'] == i]
.['message']
.sample(msg_per_cluster, random_state=42)
.values
)
promt = f'Что общего у этих обращений?\n\nОбращения:\n"""\n{joined_messages}\n"""\n\nТема:'
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{
"role": "user",
"content": promt
}
],
temperature=0,
max_tokens=128, # Этот параметр можно изменять для более подробного или короткого описания
top_p=1,
frequency_penalty=0,
presence_penalty=0,
)
print(f"Тема кластера №{i}: ", response['choices'][0]['message']['content'].replace("\n", ""), '\n')
print(joined_messages)
print('\n\n')
# Тема кластера №0: Изменение времени приема у врача.
# Как отменить изменение времени приема?
# Есть ли ограничения по количеству раз, когда можно изменить время приема?
# Могу ли я изменить время приема через интернет?
# Какие данные нужно предоставить для изменения времени приема?
# Могу ли я выбрать время приема врача?
# Тема кластера №1: Медицинские справки и их получение.
# Какие медицинские справки нужны для трудоустройства?
# Какие медицинские справки нужны для получения водительского удостоверения?
# Как получить медицинскую справку?
# Какие медицинские справки нужны для выезда за границу?
# Могу ли я получить медицинскую справку по почте или электронной почте?
# Тема кластера №2: Пластическая хирургия.
# Добрый день, я хочу сделать операцию по подтяжке лица. Как долго будет идти восстановление после операции?
# Добрый день, я хотел бы узнать о возможностях пластической операции по удалению рубцов.
# Здравствуйте, я хотел бы узнать, какую процедуру можно сделать для коррекции формы бровей?
# Добрый день, мне не нравится форма моего живота. Какие есть варианты пластической коррекции?
# Здравствуйте, я хочу сделать операцию по изменению формы ушей. Какие ограничения будут после операции?
# Тема кластера №3: Результаты анализов.
# Какие услуги могут быть оказаны на основе результатов анализов?
# Как мне получить результаты анализов?
# Какие данные нужно предоставить для получения результатов анализов?
# Как понять, что означают результаты анализов?
# Могу ли я получить результаты анализов у лечащего врача?
# Тема кластера №4: Запись на прием к врачу.
# Как мне записаться на прием к врачу?
# Какие документы нужны для записи на прием?
# Как отменить запись на прием?
# Какие данные нужно указать при онлайн-записи?
# Могу ли я записаться на прием через интернет?
df['cluster_name'] = df['сluster'].replace(
{
0: 'Изменение времени приема',
1: 'Справки',
2: 'Пластическая хирургия',
3: 'Результаты анализов',
4: 'Запись на прием'
})
df['cluster_name'].value_counts()
# Результаты анализов 36
# Пластическая хирургия 25
# Изменение времени приема 24
# Запись на прием 19
# Справки 14
df[df['class'] != df['cluster_name']]
Еще в блоге
Еще в блоге
Еще в блоге