region:us
---
configs:
- config_name: default
  data_files:
  - split: train
    path: data/train-*
dataset_info:
  features:
  - name: text
    dtype: string
  splits:
  - name: train
    num_bytes: 15215273427
    num_examples: 5091142
  download_size: 8903954435
  dataset_size: 15215273427
---
# 영어 위키 데이터셋(En_wiki)
* 개요 
  - 이 데이터셋은 영어 위키 데이터를 기반으로 만들어졌습니다. 원본 위키 데이터를 처리하기 위해 wikiextractor.py를 사용하여 텍스트 형식으로 변환하였습니다.
  - 이 데이터셋을 제작한 주요 취지는 영어 자연어 처리 연구와 애플리케이션 개발에 사용할 수 있는 광범위한 텍스트 데이터를 제공하기 위함입니다.
  - dataset map을 사용하실때는 반드시 streaming=True를 사용하셔야 합니다. 컴퓨팅 파워가 엄청 좋지 않다면, 램이 터질 수 있습니다. 

* 데이터 구조
  - text: 위키 문서의 본문을 포함하는 문자열입니다.

* 사용 방법
  1. huggingface dataset과 map을 활용하는 방법 
  ```python3
  from datasets import load_dataset
  ko_dataset = load_dataset("text", 
                            "daje/en_wiki", 
                            split="train", 
                            streaming=True)
  
  ko_wiki_tokenized = ko_dataset.map(lambda x : tokenizer(x["text"], 
                                                   max_length=256, 
                                                   padding="max_length", 
                                                   truncation=True),
                                     remove_columns=["text"])
  ```

  2. 파이썬 스크립트를 사용하는 방법
  ```
  import os
  from tqdm import tqdm
  from transformers import AutoTokenizer
  
  import argparse
  parser = argparse.ArgumentParser()
  parser.add_argument('--input_path', type=str)
  parser.add_argument('--output_path', type=str)
  parser.add_argument('--model_name_or_path', type=str)
  parser.add_argument('--max_seq_length', type=int, default=256)
  parser.add_argument('--add_sep', default=True, action='store_true')
  args = parser.parse_args()
  
  
  def get_num_lines(fname):
      res = os.popen(f'wc -l {fname}').read()
      lines = res.strip().split()[0]
      return int(lines)
  
  def main(args):
      seq_length = args.max_seq_length - 3 # room for [BOS], [EOS], [UNK]
      input_fs = open(args.input_path, 'r')
      output_fs = open(args.output_path, 'a')
      total_line = get_num_lines(args.input_path)
      tokenizer = AutoTokenizer.from_pretrained(args.model_name_or_path)
      
      buffer = []
      for doc in tqdm(input_fs, total=total_line):
          tokens = tokenizer.tokenize(doc)
          buffer += tokens
          if args.add_sep:
              buffer += [tokenizer.eos_token] # 자신이 사용하는 tokenizer에 맞추어서 eos, sep을 넣으시면 됩니다. 

          while len(buffer) > seq_length:
              text = ' '.join(buffer[:seq_length])
              output_fs.write(text)
              output_fs.write('\n')
              buffer = buffer[seq_length:]
  
      input_fs.close()
      output_fs.close()
  
  if __name__ == '__main__':
      main(args)
  ```

