{"id":32391,"date":"2024-11-01T09:08:36","date_gmt":"2024-11-01T09:08:36","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=32391"},"modified":"2024-11-01T11:18:57","modified_gmt":"2024-11-01T11:18:57","slug":"deep-learning-for-natural-language-processing-solving-kornli-with-kobert-multi-class-classification","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/32391\/","title":{"rendered":"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification)"},"content":{"rendered":"<p><body><\/p>\n<article>\n<header>\n<p>Author: [Author Name]<\/p>\n<p>Date: [Date]<\/p>\n<\/header>\n<section>\n<h2>1. Introduction<\/h2>\n<p>Natural language processing is a technology that enables computers to understand and process human language, utilized in various fields such as machine translation, sentiment analysis, and question-answering systems. Particularly, recent advancements in deep learning technology have led to significant innovations in the field of natural language processing. In this article, we aim to explore the multi-class classification problem using the KoBERT model with the KorNLI dataset in depth.<\/p>\n<\/section>\n<section>\n<h2>2. Natural Language Processing and Deep Learning<\/h2>\n<p>The reasons deep learning technology is used for natural language processing are as follows. First, deep learning models can learn based on large amounts of data, making them suitable for learning complex patterns in language. Second, neural network architectures have the capability to integrate and process various types of data (text, images, etc.). Finally, recently, Transformer-based models have shown outstanding performance in the field of natural language processing.<\/p>\n<\/section>\n<section>\n<h2>3. Introduction to KoBERT<\/h2>\n<p>KoBERT is a BERT (Bidirectional Encoder Representations from Transformers) model specialized for the Korean language, pre-trained on Korean datasets. This model demonstrates high performance in Korean natural language processing tasks and can easily be applied to various sub-tasks (sentiment analysis, named entity recognition, etc.). The main features of KoBERT are as follows:<\/p>\n<ul>\n<li>Based on a bidirectional Transformer architecture for effective context understanding<\/li>\n<li>Uses a tokenizer optimized for the characteristics of the Korean language<\/li>\n<li>Excellent transfer learning performance for various natural language processing tasks<\/li>\n<\/ul>\n<\/section>\n<section>\n<h2>4. KorNLI Dataset<\/h2>\n<p>The KorNLI (Korean Natural Language Inference) dataset is a Korean natural language inference (NLI) dataset that performs the task of classifying relationships between sentence pairs into multiple classes (Entailment, Neutral, Contradiction). This dataset is suitable for evaluating the reasoning capabilities of natural language processing models. The characteristics of the KorNLI dataset are as follows:<\/p>\n<ul>\n<li>Consists of a total of 50,000 sentence pairs<\/li>\n<li>Includes a variety of topics, covering general natural language inference problems<\/li>\n<li>Labels are composed of Entailment, Neutral, and Contradiction<\/li>\n<\/ul>\n<\/section>\n<section>\n<h2>5. Building a KorNLI Model Using KoBERT<\/h2>\n<h3>5.1. Library Installation<\/h3>\n<p>We will install the necessary libraries to build the model. Primarily, we will use PyTorch and Hugging Face&#8217;s Transformers library.<\/p>\n<pre><code>!pip install torch torchvision transformers<\/code><\/pre>\n<h3>5.2. Data Preprocessing<\/h3>\n<p>This is the process of loading the KorNLI dataset and preprocessing it into the appropriate format. We will use sentence pairs as input and assign the corresponding labels as output.<\/p>\n<pre><code>\nimport pandas as pd\n\n# Load the dataset\ndata = pd.read_csv('kornli_dataset.csv')\n\n# Check the data\nprint(data.head())\n            <\/code><\/pre>\n<h3>5.3. Defining the KoBERT Model<\/h3>\n<p>We will load the KoBERT model and add layers for the classification task. Below is the basic code for model definition.<\/p>\n<pre><code>\nfrom transformers import BertTokenizer, BertForSequenceClassification\n\n# Initialize tokenizer and model\ntokenizer = BertTokenizer.from_pretrained('monologg\/kobert')\nmodel = BertForSequenceClassification.from_pretrained('monologg\/kobert', num_labels=3)\n            <\/code><\/pre>\n<h3>5.4. Model Training<\/h3>\n<p>We will use PyTorch&#8217;s DataLoader to load the data in batches for model training. The model will be trained for a number of epochs.<\/p>\n<pre><code>\nfrom torch.utils.data import DataLoader, Dataset\n\nclass KorNliDataset(Dataset):\n    def __init__(self, texts, labels, tokenizer, max_len):\n        self.labels = labels\n        self.texts = texts\n        self.tokenizer = tokenizer\n        self.max_len = max_len\n\n    def __len__(self):\n        return len(self.texts)\n\n    def __getitem__(self, idx):\n        text = self.texts[idx]\n        label = self.labels[idx]\n\n        encoding = self.tokenizer.encode_plus(\n            text,\n            add_special_tokens=True,\n            max_length=self.max_len,\n            return_token_type_ids=False,\n            padding='max_length',\n            return_attention_mask=True,\n            return_tensors='pt',\n            truncation=True\n        )\n\n        return {\n            'input_ids': encoding['input_ids'].flatten(),\n            'attention_mask': encoding['attention_mask'].flatten(),\n            'labels': torch.tensor(label, dtype=torch.long)\n        }\n\n# Define DataLoader\ndataset = KorNliDataset(data['text'].values, data['label'].values, tokenizer, max_len=128)\ndataloader = DataLoader(dataset, batch_size=16, shuffle=True)\n\n# Define optimizer\noptimizer = torch.optim.AdamW(model.parameters(), lr=2e-5)\n\n# Model training\nmodel.train()\nfor epoch in range(epochs):\n    for batch in dataloader:\n        optimizer.zero_grad()\n        outputs = model(\n            input_ids=batch['input_ids'],\n            attention_mask=batch['attention_mask'],\n            labels=batch['labels']\n        )\n        loss = outputs.loss\n        loss.backward()\n        optimizer.step()\n            <\/code><\/pre>\n<h3>5.5. Model Evaluation<\/h3>\n<p>We will use validation data to evaluate the performance of the trained model. Performance metrics such as accuracy can be used.<\/p>\n<pre><code>\nmodel.eval()\npredictions = []\ntrue_labels = []\n\nwith torch.no_grad():\n    for batch in validation_dataloader:\n        outputs = model(\n            input_ids=batch['input_ids'],\n            attention_mask=batch['attention_mask']\n        )\n\n        preds = torch.argmax(outputs.logits, dim=1)\n        predictions.extend(preds.numpy())\n        true_labels.extend(batch['labels'].numpy())\n\n# Calculate accuracy\nfrom sklearn.metrics import accuracy_score\naccuracy = accuracy_score(true_labels, predictions)\nprint(f'Accuracy: {accuracy}')\n            <\/code><\/pre>\n<\/section>\n<section>\n<h2>6. Conclusion<\/h2>\n<p>By utilizing KoBERT to solve the multi-class classification problem with the KorNLI dataset, we explored the potential for advancements in Korean natural language processing and the usefulness of deep learning technology. Furthermore, the development of deep learning-based natural language processing technologies is expected to accelerate, with applications in various fields.<\/p>\n<\/section>\n<footer>\n<h2>References<\/h2>\n<ul>\n<li>Devlin, J., Chang, M. W., Lee, K., &amp; Toutanova, K. (2019). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.<\/li>\n<li>Monologg, K. (2020). KoBERT: Korean BERT Model.<\/li>\n<li>KorNLI Dataset. [Link to dataset]<\/li>\n<\/ul>\n<\/footer>\n<\/article>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Author: [Author Name] Date: [Date] 1. Introduction Natural language processing is a technology that enables computers to understand and process human language, utilized in various fields such as machine translation, sentiment analysis, and question-answering systems. Particularly, recent advancements in deep learning technology have led to significant innovations in the field of natural language processing. In &hellip; <a href=\"https:\/\/atmokpo.com\/w\/32391\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification)&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[104],"tags":[],"class_list":["post-32391","post","type-post","status-publish","format-standard","hentry","category---en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification) - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/32391\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification) - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"Author: [Author Name] Date: [Date] 1. Introduction Natural language processing is a technology that enables computers to understand and process human language, utilized in various fields such as machine translation, sentiment analysis, and question-answering systems. Particularly, recent advancements in deep learning technology have led to significant innovations in the field of natural language processing. In &hellip; \ub354 \ubcf4\uae30 &quot;Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification)&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/32391\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:08:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:18:57+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/32391\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32391\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification)\",\"datePublished\":\"2024-11-01T09:08:36+00:00\",\"dateModified\":\"2024-11-01T11:18:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32391\/\"},\"wordCount\":546,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"Deep learning natural language processing\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/32391\/\",\"url\":\"https:\/\/atmokpo.com\/w\/32391\/\",\"name\":\"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification) - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:08:36+00:00\",\"dateModified\":\"2024-11-01T11:18:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32391\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/32391\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/32391\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification) - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/32391\/","og_locale":"ko_KR","og_type":"article","og_title":"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification) - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"Author: [Author Name] Date: [Date] 1. Introduction Natural language processing is a technology that enables computers to understand and process human language, utilized in various fields such as machine translation, sentiment analysis, and question-answering systems. Particularly, recent advancements in deep learning technology have led to significant innovations in the field of natural language processing. In &hellip; \ub354 \ubcf4\uae30 \"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification)\"","og_url":"https:\/\/atmokpo.com\/w\/32391\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:08:36+00:00","article_modified_time":"2024-11-01T11:18:57+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"4\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/32391\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/32391\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification)","datePublished":"2024-11-01T09:08:36+00:00","dateModified":"2024-11-01T11:18:57+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/32391\/"},"wordCount":546,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["Deep learning natural language processing"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/32391\/","url":"https:\/\/atmokpo.com\/w\/32391\/","name":"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification) - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:08:36+00:00","dateModified":"2024-11-01T11:18:57+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/32391\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/32391\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/32391\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"Deep Learning for Natural Language Processing: Solving KorNLI with KoBERT (Multi-Class Classification)"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32391","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=32391"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32391\/revisions"}],"predecessor-version":[{"id":32392,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32391\/revisions\/32392"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=32391"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=32391"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=32391"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}