본문 바로가기

IT To do and To was

22년 4월 11일_자연어처리 + 정처기 필기

728x90
반응형

월요일[너무 잠이 오네]

1. 자연어 처리 코드 공유

2. 금일 정처기 필기(못 외우는 것만)

 

1. 머신러닝 자연어 처리

º Tokenizing (처리하고자 하는 텍스트에 대한 정보를 특정 단위별로 나누는 작업, 단어, 형태소, 문장 토그나이징)

영어 [ nltk, spacy ]가 대표적

 

nltk 다운로드 
아나콘다 cmd에서는 conda install -c anaconda nltk 
주피터에서는

import nltk

nltk.download('all-corpora')
nltk.download('punkt')

from nltk.tokenize import word_tokenize

 

불용어 날리는 코드

stop_words = set(stopwords.words('english')) #불용어 날리기
word_tokens = word_tokenize(sentence)
result = []
for w in word_tokens :
    if w not in stop_words:
        result.append(w)
print(word_tokens)
print(result)

 

-----------------------------------------------------------------------------------------------

Spacy 다운로드

아나콘다 cmd에서 conda install -c conda-forge spacy

주피터에서 import spacy

 

한글 [KoLNPy]가 대표적

import konlpy

from konlpy.tag import Hannanum
from konlpy.tag import Kkma
from konlpy.tag import Komoran
from konlpy.tag import Okt

 

print(okt.nouns(text)) #명사만 뽑아줌

print(okt.phrases(text)) #어절 단위로 추출

print(okt.pos(text, join=True)) #품사 식별

 

º 영화 리뷰 자연어 처리

import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
DATA_IN_PATH = './data-in/'
print("파일 크기 : ")
for file in os.listdir(DATA_IN_PATH):
    if 'txt' in file :
        print(file.ljust(30) + str(round(os.path.getsize(DATA_IN_PATH + file) / 1000000, 2)) + 'MB')
train_data = pd.read_csv(DATA_IN_PATH + 'ratings_train.txt',
                        delimiter='\t', quoting=3) #구분이 \t quoting은 
train_data.head()
train_length = train_data['document'].astype(str).apply(len)
train_length.head()
#히스토그램으로 시각화
plt.figure(figsize=(12, 5))
plt.hist(train_length, bins=200, alpha=0.5, color= 'r')
plt.yscale('log', nonpositive='clip')
plt.title('Log-Histogram of length of review')
plt.xlabel('Length of review')
plt.ylabel('Number of review') #10의 지수형태로 변경
plt.show()

print('리뷰 길이 최대 값: {}'.format(np.max(train_length)))
print('리뷰 길이 최소 값: {}'.format(np.min(train_length)))
print('리뷰 길이 평균 값: {:.2f}'.format(np.mean(train_length)))
print('리뷰 길이 표준편차: {:.2f}'.format(np.std(train_length)))
print('리뷰 길이 중간 값: {}'.format(np.median(train_length)))
# 사분위의 대한 경우는 0~100 스케일로 되어있음
print('리뷰 길이 제 1 사분위: {}'.format(np.percentile(train_length, 25)))
print('리뷰 길이 제 3 사분위: {}'.format(np.percentile(train_length, 75)))
# wordcloud
train_review = [review for review in train_data['document'] if type(review) is str]
wordcloud = WordCloud(font_path=DATA_IN_PATH + 'NanumGothic.otf').generate(' '.join(train_review))

plt.figure(figsize=(15,10))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show

#바그래프
fig, axe = plt.subplots(ncols=1)
fig.set_size_inches(6, 3)
sns.countplot(x=train_data['label'])
plt.show()

print("긍정 리뷰 개수: {}".format(train_data['label'].value_counts()[1]))
print("부정 리뷰 개수: {}".format(train_data['label'].value_counts()[0]))

람다식과  함수 차이

함수 람다식
def get_length(s):
    return len(s.split(' ')) #빈칸기준으로 split한 배열이 나오고 그것을 len

train_word_counts = train_data['document'].astype(str).apply(get_length)

print(train_word_counts[:5])
train_word_conts = train_data['document'].astype(str).apply(lambda x: len(x.split(' '))) #한번 쓰고 버릴 거면 람다식이 편함
plt.figure(figsize=(15, 10))
plt.hist(train_word_counts, bins=50, facecolor='r',label='train')
plt.title('Log-Histogram of word count in review', fontsize=15)
plt.yscale('log', nonpositive='clip')
plt.legend()
plt.xlabel('Number of words', fontsize=15)
plt.ylabel('Number of reviews', fontsize=15)
plt.show()


print('리뷰 단어 개수 최대 값: {}'.format(np.max(train_word_counts)))
print('리뷰 단어 개수 최소 값: {}'.format(np.min(train_word_counts)))
print('리뷰 단어 개수 평균 값: {:.2f}'.format(np.mean(train_word_counts)))
print('리뷰 단어 개수 표준편차: {:.2f}'.format(np.std(train_word_counts)))
print('리뷰 단어 개수 중간 값: {}'.format(np.median(train_word_counts)))
# 사분위의 대한 경우는 0~100 스케일로 되어있음
print('리뷰 단어 개수 제 1 사분위: {}'.format(np.percentile(train_word_counts, 25)))
print('리뷰 단어 개수 제 3 사분위: {}'.format(np.percentile(train_word_counts, 75)))

#특수문자 유무 확인 _ 람다식 활용
qmarks = np.mean(train_data['document'].astype(str).apply(lambda x: '?' in x)) # 물음표가 구두점으로 쓰임
fullstop = np.mean(train_data['document'].astype(str).apply(lambda x: '.' in x)) # 마침표
                  
print('물음표가있는 질문: {:.2f}%'.format(qmarks * 100))
print('마침표가 있는 질문: {:.2f}%'.format(fullstop * 100))

#데이터 전처리
import re
import json
from konlpy.tag import Okt
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.preprocessing.text import Tokenizer

review_text = re.sub("[^가-힇 ㄱ-ㅎ ㅏ-ㅣ \\s]", "", train_data['document'][0])
print(review_text)

okt = Okt()
review_text = okt.morphs(review_text, stem=True)
print(review_text)

#의미 없는 단어 제거
stop_words = set(['은', '는', '이', '가', '하', '아', '것', '들','의', '있', '되', '수', '보', '주', '등', '한'])
clean_review = [token for token in review_text if not token in stop_words]
print(clean_review)

def preprocessing(review, okt, remove_stopwords=False, stop_words=[]):
    review_text = re.sub("[^가-힇 ㄱ-ㅎ ㅏ-ㅣ \\s]", "", review) #아닌것은 제거 ㄱ-ㅎ
    word_review = okt.morphs(review_text, stem=True)
    if remove_stopwords:
        word_review = [token for token in word_review if not token in stop_words]
    return word_review

clean_train_review = []
 
for review in train_data['document']:
    if type(review) == str: 
        clean_train_review.append(preprocessing(review, okt, remove_stopwords=True,
                                               stop_words=stop_words))
    else:
        clean_train_review.append([])

#테스트 데이터 불러오기

test_data = pd.read_csv(DATA_IN_PATH + 'ratings_test.txt',
                        delimiter='\t', quoting=3) #구분이 \t quoting은 
clean_test_review = []
for review in test_data['document']:
    if type(review) == str: 
        clean_test_review.append(preprocessing(review, okt, remove_stopwords=True,
                                               stop_words=stop_words))
    else:
        clean_test_review.append([])
print(clean_test_review[:4])

tokenizer = Tokenizer()
tokenizer.fit_on_texts(clean_train_review)
train_sequences = tokenizer.texts_to_sequences(clean_train_review)
print(train_sequences[:5])
test_sequences = tokenizer.texts_to_sequences(clean_test_review)
word_vocab = tokenizer.word_index
print(word_vocab['더빙'])
# max_sequence_length = 8 고정길이를 만들어주는게 pad_sequences
MAX_SEQUENCE_LENGTH = 8
train_inputs = pad_sequences(train_sequences, maxlen=MAX_SEQUENCE_LENGTH, padding='post' )
print(train_inputs[:5])
train_labels = np.array(train_data['label'])
test_inputs = pad_sequences(test_sequences, maxlen=MAX_SEQUENCE_LENGTH, padding='post' )
test_labels = np.array(test_data['label'])
DATA_IN_PATH ='data-in/'
TRAIN_INPUT_DATA ='nsmc_train_input.npy'
TRAIN_LABEL_DATA = 'nsmc_train_label.npy'
TEST_INPUT_DATA ='nsmc_test_input.npy'
TEST_LABEL_DATA = 'nsmc_test_label.npy'
DATA_CONFIG = 'nsmc_data_configs.json'

data_configs = {}
data_configs['vocab'] = word_vocab
data_configs['vocab_size'] = len(word_vocab)
import os
if not os.path.exists(DATA_IN_PATH):
    os.makedirs(DATA_IN_PATH)
np.save(open(DATA_IN_PATH + TRAIN_INPUT_DATA, 'wb'), train_inputs)
np.save(open(DATA_IN_PATH + TRAIN_LABEL_DATA, 'wb'), train_labels)
np.save(open(DATA_IN_PATH + TEST_INPUT_DATA, 'wb'), test_inputs)
np.save(open(DATA_IN_PATH + TEST_LABEL_DATA, 'wb'), test_labels)

json.dump(data_configs, open(DATA_IN_PATH + DATA_CONFIG, 'w'), ensure_ascii=False)

2. 정보처리기사 헷갈리는 거 필기

 

º 인터페이스 설계

소프트웨어 요구사항 분석기법

 요구사항 분류(기능적, 비기능적), 개념 모델링, 요구사항 할당, 요구사항 협상, 정형분석

 

기능적 요구사항 : 시스템이 무엇을 하는지, 어떤 기능을 하는지 대하는 것

비기능적 요구사항 : 프로젝트 개발과정 등에서 지켜야 할 제약사항

 

인터페이스 요구사항 검증 주요 항목

 기능성 : 요구사항이 어떻게 보다 무엇을에 중점을 두고 있는가?

 추적 가능성 : 요구사항 명세서와 설계서를 추적할 수 있는가

 변경 용이성 : 요구사항 명세서의 변경이 쉽도록 작성되었는가

 

인터페이스의 시스템 시별 

- 개발 시스템 식별 : 인터페이스 관련 자료들을 기반으로 개발하고자 하는 시스템의 상세 식별정보를 정의하고 목록을 작성하는 것

- 내 외부 시스템 식별

- 내 외부 시스템 환경 및 관리주체 식별 : 실제 운용환경을 의미 하드웨어를 실제적으로 관리하는 담당자

- 내 외부 시스템 네트워크 연결 정보 식별 : 내 외부를 연결하는데 필요한 네트워크 연결 정보를 확인

- 인터페이스 식별 : 인터페이스 요구사항 명세서와 인터페이스 요구사항 목록을 기반으로 개발할 시스템과 이와 연계할 내 외부 시스템 사이의 인터페이스를 식별하고 목록을 작성

- 인터페이스 시스템 식별 : 인터페이스 별로 인터페이스에 참여하는 시스템

 

송수신 데이터 식별

식별 대상 데이터 : 송 수신 시스템 사이에서 교환되는 데이터로 종류로는 표준항목, 송 수신 데이터 항목 공통 코드가 있다

 

인터페이스 주요 항목 {시스템 공통부 : 시스템 간 연동 시 필요한 공통 정보, 거래 공통부 : 시스템들이 연동된 후 송 수신되는 데이터를 처리할 때 필요한 정보}

 

인터페이스 처리 유형

지연처리 = 데이터를 매진 단위 비용이 높을 때 사용

배치 = 대량의 데이터

 

송수신 방법 명세화 업부, 데이터의 성격, 연계 데이터 발생건수, 연계 시스템의 기술구조, 시스템 간의 성능을 고려하여 작성

 

시스템 인터페이스 설계 시 목록에는 연계업무와 연계에 참예하는 송수신 시스템의 정보 , 연계 방식과 통신 유형 등에 대한 정보를 기록

 

미들웨어는 위치 투명성을 제공하는데 투명성이란 액세스 하려는 시스템의 실제 위치를 알 필요 없이 단지 시스템의 논리적인 명칭만으로 액세스 할 수 있다

 

//yesterday wished to today list

. 긍정적으로 생각하는 것을 앞으로 잊지 않기 ✔

. 하고싶은대로 생각하고 말하기  ✔

. 깊게 되뇌이기  ✔

. 스트레스 받는 일은 없는 것이라고 생각하는 힘 키우기  ✔

 

tomorrow wish list

 

. 좋은 인상 남기기

. 말 실수하지 않기

. 긍정적으로 생각하기

 

728x90
반응형