# _yield_len_iter


# 토크나이징을 하는 작업 등은 text 파일의 line by line으로 처리

# 메모리에 올리지 않아도 됨

# generator 형태로 text를 메모리에 line by line으로 올려서 작업을 하려면 __iter__ 함수를 구현

# DoublespaceLineCorpus는 이미 iter가 구현


class DoublespaceLineCorpus:

    def __init__(self, corpus_fname, iter_sent = False):

        self.corpus_fname = corpus_fname

        self.iter_sent = iter_sent


    def __iter__(self):

        with open(self.corpus_fname, encoding='utf-8') as f:

            for doc_idx, doc in enumerate(f):

                if not self.iter_sent:

                    yield doc

                    continue

                for sent in doc.split('  '):

                    sent = sent.strip()

                    if not sent: continue

                    yield sent

                # doc의 sent에 대하여 empty str이 아니면...

                # 아래의 "for snet in corpus"부분에 sent로 메모리에

                # 그 str 값을 올리라는 의미



corpus = DoublespaceLineCorpus('./day0_3.txt', iter_sent=True)

for n_sent, sent in enumerate(corpus):

    print('{} snet: {}. itslength is {}'.format(n_sent, sent, len(sent)))

# 위의 예시에서 메모리에는 for loop에서 정의되는 sent만 만들어져 사용됨

# 다음 loop로 넘어가면서 메모리에 올라가지 않음

0 snet: 테스트 데이터 입니다. itslength is 11

1 snet: 이것만 한 줄에 두 개의 문장을 넣어둘 겁니다. itslength is 25

2 snet: 문장을 이렇게 만들어 둘거에요. itslength is 16

3 snet: yield test와. itslength is 11

4 snet: len test를 해보세요. itslength is 14


    

# len(corpus)하면 length 출력하게 만들기

class DoublespaceLineCorpus:

    def __init__(self, corpus_fname, iter_sent = False):

        self.corpus_fname = corpus_fname

        self.iter_sent = iter_sent

        self.num_sents = 0

        self.num_docs = 0


    def __iter__(self):

        with open(sef.corpus_fname, encoding='utf-8') as f:

            for doc_idx, doc in enumerate(f):

                if not self.iter_sent:

                    yield doc

                    continue

                for sent in doc.split('  '):

                    sent = sent.strip()

                    if not sent: continue

                    yield sent


    def __len__(self):

        if self.iter_sent:

            if self.num_sents == 0:

                with open(self.corpus_fname, encoding='utf-8') as f:

                    self.num_sents = sum((True for doc in f for sent in doc.strip().split('  ') if sent.strip()))

            return self.num_sents

        else:

            if self.num_docs == 0:

                with open(self.corpus_fname, encoding='utf-8') as f:

                    self.num_docs = sum((True for doc in f if doc.strip()))

            return self.num_docs

        

corpus = DoublespaceLineCorpus('./day0_3.txt', iter_sent=True)

print('when iter_sent == True, n sents = {}'.format(len(corpus)))

when iter_sent == True, n sents = 5


corpus.iter_sent=False

print('when iter_sent == False, n docs = {}'.format(len(corpus)))

when iter_sent == False, n docs = 4



                    



'파이썬' 카테고리의 다른 글

beautiful soup 4, lxml, requests 설치 방법  (1) 2017.08.30
Scraping Naver Movie  (0) 2017.08.30
slice and sorting  (0) 2017.08.29
list comprehension  (0) 2017.08.28
Pickle  (0) 2017.08.28

+ Recent posts