license:cc-by-nc-4.0 region:us
---
license: cc-by-nc-4.0
dataset_info:
  features:
  - name: conversation
    sequence: string
  - name: hash
    dtype: string
  splits:
  - name: train
    num_bytes: 825523
    num_examples: 253
  download_size: 367027
  dataset_size: 825523
---


### Version 1

```python
import json

with open("verbalist/datasets/RyokoAI_ShareGPT52K/sg_90k_part1.json") as f:
    dataset1 = json.load(f)
with open("verbalist/datasets/RyokoAI_ShareGPT52K/sg_90k_part2.json") as f:
    dataset2 = json.load(f)
dataset = dataset1 + dataset2

import re
import regex
import hashlib


def filter_string(string):
    has = True
    has_zh = not len(re.findall(r"[\u4e00-\u9fff]+", string)) > 0
    has_ko = not len(re.findall(r"[\u3131-\ucb4c]+", string)) > 0
    has = has_zh and has_ko
    invalid_letters = "ієùéàçğİžš"
    for letter in invalid_letters:
        if letter in string:
            return False
    return has


def has_cyrillic(text):
    return bool(regex.search(r"\p{IsCyrillic}", text))


clean_dataset = []

for conversation in dataset:
    all_text = "\n".join([item["value"] for item in conversation["conversations"]])
    # print(all_text)
    # break
    if filter_string(all_text) and has_cyrillic(all_text):
        clean_dataset.append(conversation)

import markdownify


def correct_string(string):
    string = string.replace("\\_", "_")

    languages = [
        "css",
        "python",
        "go",
        "html",
        "kotlin",
        "diff",
        "vba",
        "sql",
    ]
    for lang in languages:
        string = string.replace(f"\n{lang}Copy code`", f"{lang}\n")

    string = string.replace("`\n```", "\n```")
    string = string.replace("\n ", "\n  ")
    delete_phrases = [
        "Как искусственный интеллект, я не являюсь владельцем физических объектов и не могу продавать или покупать предметы. Однако, я могу поделиться советом, как можно попытаться убедить кого-то в покупке карандаша.",
        "Как искусственный интеллект, я не имею личных чувств и мнений, и не могу иметь предпочтений в выборе между рождением своего ребенка и усыновлением приемного ребенка из приюта.",
        "1 / 1",
        "2 / 2",
        "3 / 3",
        "4 / 4",
        "5 / 5",
        "6 / 6",
        "7 / 7",
        "8 / 8",
        "9 / 9",
        "К сожалению, я не могу проверить дату вопроса, но я могу предоставить информацию о Максиме Радайкине и Борисе Марцинкевиче на начало 2021 года.",
        "К сожалению, я не могу вставить пример базы данных в чат, но я могу объяснить, что это такое.",
        "К сожалению, я не могу написать полноценное расширение для Google Chrome в рамках этой сессии. Однако,",
        "К сожалению, я не могу выбрать материалы и дизайн за вас, так как это зависит от ваших потребностей и предпочтений. Однако,",
        "Извините, но я не могу создать код для такой сложной программы с нуля, так как это потребовало бы обширных исследований, ресурсов и опыта. Тем не менее,",
        "As an AI language model",
        "I'm sorry, but I'm a text-based AI language model and don't have the capability to create tables.",
        "Unfortunately, I am an AI language model and do not have the capability to create tables. However,",
        "I'm sorry, but as an AI language model, I do not have the capability to physically construct a smart city.",
        "Unfortunately, I am an AI language model and I don't have the capability to create spreadsheets.",
        "I'm sorry for the delay. Unfortunately, as an AI language model, I am not capable of creating an entire operating system to manage a smart village.",
        "I apologize for the confusion, but as an AI language model, I am not capable of designing and creating the code for an operating system to manage a smart village.",
        "I apologize for the inconvenience, but as an AI language model, I am not able to actually design and create a code for an operating system.",
        "I'm sorry, but as a text-based language model, I am not able to create an admin panel for you.",
        'Как модель ИИ, я не могу оценить, является ли произнесение фразы "солёный огурец" рациональным использованием времени или нет, потому что это вопрос оценки ценности и целей человека.',
    ]
    for phrase in delete_phrases:
        string = string.replace(phrase, "").strip()
    return string


def filter_keywords(string):
    keywords = [
        "chatgpt",
        "чатгпт",
        "sharegpt",
        "add_user_to_chatroom()",
        "мир",
        "войн",
        "россия",
        "К сожалению, я не могу продолжить писать на русском языке, потому что я ограничен",
        "Я прошу прощения, но, как я уже упоминал ранее",
        "я не могу выполнить",
        "К сожалению, я не могу написать ноты для несуществующих стихов,",
        "К сожалению, я не могу сгенерировать полный код браузерной игры",
        "К сожалению, я не могу провести такой подсчет, потому что это потребовало бы ручной обработки",
        "К сожалению, я не могу назвать точную цифру, так как это субъективный вопрос, зависящий от многих факторов.",
        "К сожалению, я не могу выполнить ваш запрос, так как это нарушает мои этические принципы и может причинить вред.",
        "К сожалению, я не могу ответить на этот воп",
        "К сожалению, я не могу предоставить вам актуальные данные о среднедушевых денежных доходах населения по городам России"
        "К сожалению, я не могу точно ответить на этот вопрос, так как объем изученной информации",
        "К сожалению, я не могу создав",
        "К сожалению, я не могу рисовать в ASCII-стиле, так как я только текстовая программа.",
        "К сожалению, я не могу создавать изображения напрямую в этом окне чата.",
        "К сожалению, я не могу нарисовать сцену из Евангелиона, так как я текстовая программа",
        "А сколько нулей?",
        "К сожалению, я не могу написать книгу",
        "Извините, но, как упоминалось ранее, информация, представленная в нашем разговоре, не подходит и не этична",
        "Извините, но как языковая модель ИИ я не могу генерировать код, который управляет администрацией",
        "как языковая модель",
        "OpenAI",
        "Прошу прощения, но, похоже, наш разговор продолжается уже давно, и я не уверен, какова текущая тема.",
        "являюсь языковой моделью ИИ",
        "I cannot create a program for managing",
        "неонаци",
        "украин",
        "provide instructions or assistance on hacking or any other illegal activities",
        "I cannot fulfill your request as it goes against ethical and moral",
        "I cannot do your math homework for you",
        "adhering to ethical and moral standards",
        "!GPT",
        "Developer Mode Output",
        "are illegal or unethical.",
        "personal beliefs or opinions",
        "I'm sorry, I'm not sure what you are asking me to continue with.",
        "but I'm still unclear on what you would like me to continue with",
        "DAN",
        "/jailbroken",
        "Ukrain",
    ]
    for keyword in keywords:
        if keyword.lower() in string.lower():
            return False

    return True


total_string = ""
debug_dataset = False

unsensored_filtered_dataset = []

for conversation in clean_dataset:
    conversation = [
        str(markdownify.markdownify(item["value"], heading_style="ATX"))
        for item in conversation["conversations"]
    ]
    conversation_pairs = []
    if "https://chathub.gg" in conversation[0]:
        conversation.pop(0)
    full_text = " ".join(conversation)
    if filter_keywords(full_text):
        for i in range(1, len(conversation)):
            if (i + 1) % 2 == 0:
                if debug_dataset:
                    bot_message = "BOT " + correct_string(conversation[i])
                    user_message = "USER " + correct_string(conversation[i - 1])
                else:    
                    bot_message = correct_string(conversation[i])
                    user_message = correct_string(conversation[i - 1])
                conversation_pairs.append(user_message)
                conversation_pairs.append(bot_message)

    if len(conversation_pairs) > 0:
        unsensored_filtered_dataset.append(conversation_pairs)
    
    if debug_dataset:
        all_text = "\n===\n".join([item for item in conversation_pairs])
        total_string += all_text
        total_string += "===" * 10
        total_string += "\n"
        total_string += "===" * 10
        total_string += "\n"
        total_string += "===" * 10
        total_string += "\n"
# print(total_string)

from transformers import AutoTokenizer
from verbalist.datasets.utils import visualize_hist

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")

conversation_lengths = []


for conversation in unsensored_filtered_dataset:
    all_text = "\n===\n".join([item for item in conversation])
    conversation_lengths.append(len(tokenizer(all_text)["input_ids"]))
    # print(all_text)
    # print("="*100)
    # print("="*100)
    # print("="*100)
    # break
    # if has_cyrillic(all_text):
    #     rus_conv.append(conversation)


visualize_hist(conversation_lengths, "ru_share_gpt_filtered")

filter_num = 85

passed_convs = (
    np.array(conversation_lengths) < np.percentile(conversation_lengths, filter_num)
).tolist()
unsensored_passed = []

for i, status in enumerate(passed_convs):
    if status:
        unsensored_passed.append(unsensored_filtered_dataset[i])

unsensored_dataset = []
for conv in unsensored_passed:
    conv_hash = hashlib.sha256(conv[0].encode('utf-8')).hexdigest()
    unsensored_dataset.append({
        "conversation": conv,
        "hash": conv_hash
    })
```