Showing
4 changed files
with
112 additions
and
3 deletions
code/preparation/sys_sampling.py
0 → 100644
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 |
code/util_test.py
0 → 100644
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 |
code/utils/data_loader.py
0 → 100644
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 | +_추가 예정_ | ... | ... |
-
Please register or login to post a comment