김민수

Added Utils

1 +import pandas as pd
2 +import pyarrow as pa
3 +import pyarrow.parquet as pq
4 +from tqdm import tqdm
5 +
6 +categories = ['NWRW19','NPRW19','NLRW19','NIRW19']
7 +for category in categories:
8 + table=pq.read_table(f'categorized_parquet/category={category}')
9 + labels=[]
10 + index=0
11 + last_topic=''
12 + for topic in tqdm(table['topic']):
13 + if topic!=last_topic:
14 + index=0
15 + last_topic=topic
16 + mod=index %100
17 + if mod==49:
18 + labels.append('valid')
19 + elif mod==99:
20 + labels.append('test')
21 + else:
22 + labels.append('train')
23 + index+=1
24 + pq.write_to_dataset( table.append_column('label',pa.array(labels)), root_path='dataset',
25 + partition_cols=['topic', 'label'],coerce_timestamps='us')
...\ No newline at end of file ...\ No newline at end of file
1 +import os
2 +from util.data_loader import ArticleDataset, ToTensor
3 +from gluonnlp.vocab import BERTVocab
4 +from gluonnlp.data import SentencepieceTokenizer
5 +from kogpt2.utils import get_tokenizer
6 +
7 +tokenizer = SentencepieceTokenizer(get_tokenizer(), num_best=0, alpha=0)
8 +vocab_file = os.path.join(os.path.expanduser('/code/model'), 'kogpt2_news_wiki_ko_cased_818bfa919d.spiece')
9 +vocab=BERTVocab.from_sentencepiece(vocab_file,
10 + mask_token=None,
11 + sep_token=None,
12 + cls_token=None,
13 + unknown_token='<unk>',
14 + padding_token='<pad>',
15 + bos_token='<s>',
16 + eos_token='</s>')
17 +dataset=ArticleDataset('/dataset')
18 +for i, (data, topic) in enumerate(dataset):
19 + print(i, topic)
20 + title=data[0].as_py()
21 + print('origin:',title)
22 +
23 + print('tokenized origin:',tokenizer(title))
24 + filtered=''.join(c if c.isalnum() else ' ' for c in title)
25 + print('filtered:',filtered)
26 + print('tokenized filtered:',tokenizer(filtered))
27 + print('Transformed:', ToTensor(tokenizer, vocab)((data,topic)))
28 + if i>=100:
29 + break
1 +import os
2 +import pyarrow as pa
3 +import pyarrow.parquet as pq
4 +import torch
5 +from torch.utils.data import Dataset
6 +from kogpt2.utils import get_tokenizer
7 +
8 +class ArticleDataset(Dataset):
9 + """
10 + 기사 학습을 위한 데이터셋
11 + dataset for learn articles
12 + """
13 + def __init__(self, dataset_path:str, topics:list=['경제', '문화', '미용_건강', '사회', '생활', '스포츠', '연예', '정치', 'IT_과학'], label:str='train'):
14 + """
15 + Initializer
16 + :param dataset_path: path of parquet dataset
17 + :param topic: if not None, only use specified topics; must be sublist of [경제, 문화, 미용_건강, 사회, 생활, 스포츠, 연예, 정치, IT_과학]
18 + :param label: specify type of dataset; must be one of [train, test, valid] (default is train)
19 + """
20 + expanded_dataset_path = os.path.expanduser(dataset_path)
21 + tables=[]
22 + for topic in topics:
23 + table=pq.read_table(f'{expanded_dataset_path}/topic={topic}/label={label}',columns=['paragraph'])
24 + tables.append(table.append_column('topic',pa.array([topic]*len(table))))
25 + self.data=pa.concat_tables(tables)
26 +
27 + def __len__(self):
28 + return len(self.data)
29 +
30 + def __getitem__(self,index):
31 + return self.data['paragraph'][index], self.data['topic'][index]
32 +
33 +class ToTensor(object):
34 + """
35 + Convert Article dataset paragraph to Tensor using tokenizer
36 + """
37 + def __init__(self, tokenizer, vocab):
38 + self.tokenizer=tokenizer
39 + self.vocab=vocab
40 +
41 + def __call__(self, sample):
42 + tokens=[]
43 + for i, sentence in enumerate(sample[0]):
44 + if i==0:
45 + tokens+=[self.vocab[self.vocab.bos_token]]+self.vocab[self.tokenizer(sample[1].as_py())+self.tokenizer(sentence.as_py())]+[self.vocab[self.vocab.eos_token]]
46 + else:
47 + tokens+=[self.vocab[self.vocab.bos_token]]+self.vocab[self.tokenizer(sentence.as_py())]+[self.vocab[self.vocab.eos_token]]
48 + return torch.Tensor(tokens)
...\ No newline at end of file ...\ No newline at end of file
...@@ -3,10 +3,17 @@ ...@@ -3,10 +3,17 @@
3 목표: 10년 간(2009~2018)의 신문기사를 분석하고, KoGPT2 모델을 학습시켜 신문기사를 생성합니다. 3 목표: 10년 간(2009~2018)의 신문기사를 분석하고, KoGPT2 모델을 학습시켜 신문기사를 생성합니다.
4 ## report 4 ## report
5 보고서가 들어가는 디렉토리입니다. 5 보고서가 들어가는 디렉토리입니다.
6 +추후 파일명을 정돈할 계획입니다.
6 7
7 ## code 8 ## code
8 -python으로 작성된 말뭉치 분석도구입니다. 9 +학습을 위한 python코드들입니다.
9 -전처리, 모델링, 분석, 시각화 순으로 만들 예정입니다. 10 +하위 디렉토리로 데이터 전처리(preparation), 편의성 도구(utils), 모델 및 캐시(model)가 있습니다.
10 11
12 +모두의 말뭉치 이용 약관상 전처리된 데이터는 제공하지 않습니다.
11 ## reference 13 ## reference
12 -추가 예정 14 +[Github KoGPT2](https://github.com/SKT-AI/KoGPT2 "SKT-AI/KoGPT2")\
15 +[Github KoGPT2 가사 생성](https://github.com/gyunggyung/KoGPT2-FineTuning "gyunggyung/KoGPT2-FineTuning")\
16 +[Github KoGPT2 챗봇](https://github.com/haven-jeon/KoGPT2-chatbot "haven-jeon/KoGPT2-chatbot")\
17 +[Github KoGPT2 이야기 생성](https://github.com/shbictai/narrativeKoGPT2 "shbictai/narrativeKoGPT2")
18 +
19 +_추가 예정_
......