'NLP'에 해당되는 글 4건

스파크 임시

NLP 2018. 4. 18. 17:54

모든 스파크 애플리케이션은 클러스터에서 다양한 병렬 연산을 수행하는 드라이버 프로그램으로 구성되어있다.


드라이버 프로그램들은 연산 클러스터에 대한 연결을 나타내는 SparkContext 객체를 통해 스파크에 접속한다.

쉘에서 이 SparkContext 객체는 자동으로 sc라는 변수에 만들어진다.


SparkContext 객체를 하나 만들었다면 그것으로 RDD를 만들어 낼 수 있다.

전 포스트에서 쓴 코드를 보면 텍스트파일 각 라인을 표현하는 RDD를 만들기 위해

sc.textFile()을 호출했었다. 그러고 나면 그 라인에 count() 같은 다양한 연산을 수행해 볼 수 있다.


이런 연산들을 수행하기 위해 드라이버 프로그램들은 보통 Executor(익스큐터)라 불리는 다수의 노드를 관리한다.




위의 사진은 스파크의 분산 실행을 위한 컴포넌트의 모양새이다 (출처: 러닝 스파크)


스파크가 클러스터에서 어떻게 실행되는지 알 수 있다.

'NLP' 카테고리의 다른 글

Spark RDD란 무엇인가?  (923) 2018.04.18
Spark를 설치 실행해보자  (934) 2018.04.18
파이썬으로 텍스트 마이닝 하기 (쓰는중..)  (1347) 2018.04.16
블로그 이미지

ZeroFlag

,

Spark RDD란 무엇인가?

NLP 2018. 4. 18. 16:23

RDD란 무엇인가?


R(Resilient)

D(Distributed)

D(Dataset)


R <- 데이터 손실 문제발생 시 다시 생성할 수 있다. (유실된 파티션을 재연산해 복구한다)

D <- 메모리를 이용하여 분산처리를 한다.

D <- 파일을 통해 가져올 수 있는 데이터셋 제공


따라서 Spark에서 제공하는 RDD라는 놈은 Spark에서 기본적인 데이터 단위라고 볼 수 있다.

(분산되어 있는 컬렉션)



자 그럼 RDD를 생성하여 보자


Spark QuickStart 에서보면 예제가 바로 나온다.


자 그럼 스파크를 실행시키고 예제를 한줄 한줄 입력하여 어떠한 결과가 나오는지 알아보자


# lines라는 RDD를 README.md 파일을 가져와서 만든다. (txtFile)

Scala : val lines = sc.textFile("README.md")

Python : lines = sc.textFile("README.md")

-출력결과 --> lines: org.apache.spark.rdd.RDD[String] = README.md MapPartitionsRDD[1] at textFile at <console>:24


# lines에 할당된 아이템의 갯수를 센다.

Scala : lines.count()

Python : lines.count()

-출력결과 --> res0: Long = 103


# lines에 있는 첫번째 라인에 해당하는 아이템을 불러온다.

Scala : lines.first()

Python : lines.first()

-출력결과 --> res1: String = # Apache Spark


! : 스파크 쉘이 구동될때 자동으로

SparkContext 생성후 sc라는 변수에 할당을 해준다.


그래서 sc를 직접 선언하지않고 사용할 수 있다.

sc변수가 어떻게 선언되었는지 알고싶으면 터미널에 sc를 입력하면 알 수 있다.

-출력결과 --> res2: org.apache.spark.SparkContext = org.apache.spark.SparkContext@69ed96e1



'NLP' 카테고리의 다른 글

스파크 임시  (1378) 2018.04.18
Spark를 설치 실행해보자  (934) 2018.04.18
파이썬으로 텍스트 마이닝 하기 (쓰는중..)  (1347) 2018.04.16
블로그 이미지

ZeroFlag

,

1. Spark 다운로드 하기


http://spark.apache.org/downloads.html


위 주소를 브라우저 주소창에 입력한다.



위와 같은 창이 뜬다면 맞게 들어온 것이다.


보면 1,2,3,4 단계로 나뉘는데

3단계 까지만 하면 된다.


1. 자신이 원하는 스파크의 버전을 나타낸다.

   콤보 박스 형태이기 때문에 마우스로 클릭해서 고를 수 있다.


2. 같이 설치할 하둡의 버전을 나타낸다

    마찬가지로 콤보 박스 형태로나온다.


3. 선택이 끝나면 3번에 있는 파란색 텍스트를 클릭하면 다운로드 페이지로 넘어가게 된다.




이런 페이지가 뜨는데 맨 위 미러링크를 클릭하면 파일을 다운로드 하게 된다.



2. 스파크 압축풀기


다운르드가 완료되면 spark-2.3.0-bin-hadoop2.7.taz 라는 파일이 생성되어 있을 것이다.


맥일 경우 대부분 다운로드에 저장이되는데 다운로드 파일을 자신이 지정한 디렉토리로 옮겨주면 된다.


필자는 다운로드후 바탕화면에 Spark 라는 디렉토리를 생성하여 옮겨주었다.


그리고 압축을 풀어준다.


압축을 풀어주는 방법은 간단한데 


tar -xf spark-2.3.0-bin-hadoop2.7.tgz


위의 명령어를 입력하면 쉽게 압축이 풀릴 것이다.


압축을 풀고나면 ls 명령어를 통해 파일들이 멀쩡하게 있는지 확인해보자


LICENSE README.md conf jars python

NOTICE RELEASE data kubernetes sbin

R bin examples licenses yarn


이런식으로 나타난다면 정상이다.



3. 스파크를 실행해보자


스파크는 Scala 또는 Python을 사용하여 실행할 수 있다.

(만일 현재 보고있는 경로가 압축을 풀고난 디렉토리가 아닐경우 경로를 이동해주어라)

(명령어 : cd spark-2.3.0-bin-hadoop2.7 을 입력하면 된다.)


파이썬을 이용한 쉘을 열려면

bin/pyspark


Scala를 이용한 쉘을 열려면

bin/spark-shell


실행후의 화면



이렇게 뜬다면 정상적으로 실행된것이다.

'NLP' 카테고리의 다른 글

스파크 임시  (1378) 2018.04.18
Spark RDD란 무엇인가?  (923) 2018.04.18
파이썬으로 텍스트 마이닝 하기 (쓰는중..)  (1347) 2018.04.16
블로그 이미지

ZeroFlag

,

파이썬으로 가능한 기본적인 처리방법들


제 .1 방법 : 공란처리


영어나 한글 일본어 등등 텍스트의 경우 공란(Space Bar)는 단어와 단어를 구분하는 기능을 수행한다.

하지만 문자 입력의 실수, 또는 온라인 텍스트 수집 과정의 오류로 공란이 2개이상 발견되는 경우가 있다.

Ex(예) : 파이썬으로 가능한 기본적인 처리방법들 <- 정상

   : 파이썬으로  가능한 기본적은  처리방법들 <- 공란이 2개씩 쓰여진 문자열


2개 이상의 공란이 연달아 발견되는 경우 해당 공란을 1개로 축약시키는 방법이다.


코드는 간단하게 짤 수 있다.


# 입력하여 출력해본다.


str_text_before = '덩          기덕 쿵       더러러러 쿵 기덕 쿵          덕'

print(str_text_before)

출력결과 -->           기덕 쿵       더러러러 쿵 기덕 쿵         


# split() 처리를 통해 리스트로 만들어 준다.


str_text_after = str_text_before.split()

print(str_text_after)

출력결과 --> ['덩', '기덕', '쿵', '더러러러', '쿵', '기덕', '쿵', '덕']


# split() 처리가된 텍스트(리스트)를 join 함수를 이용하여 처리


complete_text = " ".join(str_text_after)

print(complete_text)

출력결과 --> 덩 기덕 쿵 더러러러 쿵 기덕 쿵 덕


이렇게 공란 처리가 가능하다.


제 .2 방법 : 대 소문자 통일하기


한국어 텍스트에서는 해당사항이 없지만, 영문의 경우에는 대.소문자를 구분한다.

영어의 경우 문장의 첫 단어의 첫문자, 거유명사의 첫 문자, 축양어인 경우 대문자를 사용하며

다른 경우는 소문자를 사용한다.

그러나 대문자는 문장의 특정부분을 강조하는 경우에도 종종 사용된다.


Ex(예)

'President Trump plays the trump.' <-- 이 문자열을 보면 앞의 트럼프는 대통령 트럼프를 나타내고

뒤의 트럼프는 트럼프 카드게임을 나타낸다.


이것을 어떻게 구분할까?

간단하게 하고싶다면 replace 를 사용하면 된다.


str_text = str_text.replace('Trump', 'Trump_unique')

print(str_text)

출력결과 --> President Trump_unique plays the trump.


이렇게 대통령 트럼프와 게임 트럼프를 구분할 수 있다.


이 외의 방법은

str_text = 'President Trump plays the trump.'

print(str_text)


for key in (('Trump', 'Trump_unique'), ('plays', 'uniquePlays')):

str_text = str_text.replace(*key)

print(str_text)


출력결과 --> President Trump_unique uniquePlays the trump.


이렇게 하면 여러개의 문자열을 한번에 변경 할 수 있다.


이렇게 구분이 가능해지면

이제 대문자로 하든 소문자로 하든 처리를 한다.


처리는 아주 간단하다 문자열 뒤에 lower()또는 upper()를 붙여주면 된다.


print(str_text.lower())

출력결과 --> president trump_unique uniqueplays the trump.


print(str_text.upper())

출력결과 --> PRESIDENT TRUMP_UNIQUE UNIQUEPLAYS THE TRUMP.


제 .3 방법 : HTML코드 제거하기


# &pos, &gt, &lt 등의 HTML 문자열을 제거하여 준다.

# 의존성 from bs4 import BeautifulSoup

Ex(예)


str_html = '&gt asdfasdfasdf &lt'


html_str = BeautifulSoup(str_html, 'html.parser').get_text()

print(html_str)

출력결과 --> asdfasdfasdf


이렇게 HTML에서 남은 찌꺼기를 처리할 수 있다.



제 .4 방법 : 특수문자와 숫자표현 제거하기


텍스트가 데이터에서는 숫자가 아닌 문자로 표현된 자료는 물론 숫자로 표현된 자료도 포함된다.

그렇다면 텍스트 데이터에서 숫자가 의미를 가질 수 있고 의미를 가지지 않을 수도 있다.

이게 상당히 애매한 문제인데 무조건적으로 숫자를 제거하면 정보의 왜곡될 가능성이 높다.


대부분 텍스트 마이닝을 적용한 상당수 연구자들은 숫자를 제거하거나, 모든 숫자를 하나로 통합하는 방식으로 또는 텍스트를 사전처리 적용을 한다.


숫자를 제거하고 제거안하고는 마이닝할 텍스트에 따라 다르다.


Ex(예)

str_text = 'President?#Trump!plays...the&^%trump.'

print(str_text)

출력결과 --> President?#Trump!plays...the&^%trump.


sub_text = re.sub('[^a-zA-Z]', ' ', str_text)

print(sub_text)

출력결과 --> President  Trump plays   the   trump


특수문자나 숫자가 있던자리에 공백이 덕지덕지 끼여있는데 위에있는 공란처리로

처리하면 될것이다.



제 .5 방법 : 불용어 처리하기


모든 인간의 자연어는 외부 세계 대상에 대한 지시어와 이 지시어들을 연결하는 기능어가 존재한다.

예를들어 I am a boy 와 같은 문장에서 a라는 단어는 boy라는 명사가 셀 수 있는 명사임을 알려주는 기능을 한다.

흔히 boy라는 명사는 구체적인 의미를 전달하는 경우가 많지만, a라는 부정관사에서는 구체적인 의미를 찾기 쉽지 않다.

한국어 역시 마찬가지이다. "나는 남자다." 라는 문장에서 '남자'는 명사 형태의 어간은 의미를 갖지만, '다' 라는 서술격 조사에서는 의미론적으로 특별한 의미를 찾기 쉽지 않다.


영어의 경우 a, an, the 등과 같이 빈번하게 사용되나 구체적인 의미를 찾기 어려운 단어들을 불용어

라고 부른다.


고로 문장에서 의미가 딱히없는 단어들을 제거하는 방법을 알아보자


Ex(예)

STOPWORDS = ['a','able','about','across','after','all','almost','also','am','among',

'an','and','any','are','as','at','be','because','been','but','by','can','cannot',

'could','dear','did','do','does','either','else','ever','every','for','from','get',

'got','had','has','have','he','her','hers','him','his','how','however','i','if','in',

'into','is','it','its','just','least','let','like','likely','may','me','might','most',

'must','my','neither','no','nor','not','of','off','often','on','only','or','other','our',

'own','rather','said','say','says','she','should','since','so','some','than','that','the',

'their','them','then','there','these','they','this','tis','to','too','twas','us','wants',

'was','we','were','what','when','where','which','while','who','whom','why','will','with',

'would','yet','you','your','ourselves','between','yourself','again','once','during','out',

'very','having','yours','such','itself','s','each','themselves', 'until', 'below','through',

'don','more','himself','down','above','both','up','ours','before','same','yourselves','over',

'now','under','herself','myself','those','few','t','being','theirs','against','doing','further','here']


def remove_stop_words(wordlist, stopwords=STOPWORDS):

marked = []

# ask for sentence if wordlist is empty

if not wordlist:

sentence = raw_input("type a sentence: ")

wordlist = sentence.split()

for key in wordlist:

if key.lower() in stopwords:

# marked.append('')

pass

else:

marked.append(key)

return marked



wordlist = 'President Trump between plays the trump.'.split()


marked_list = remove_stop_words(wordlist)

print(marked_list)


complete_text = " ".join(marked_list)

print(complete_text)


대략적인 불용어 처리가 이렇게 할 수 있다.

'NLP' 카테고리의 다른 글

스파크 임시  (1378) 2018.04.18
Spark RDD란 무엇인가?  (923) 2018.04.18
Spark를 설치 실행해보자  (934) 2018.04.18
블로그 이미지

ZeroFlag

,