반응형
반응형

이런 대화가 있다.
"그 사람은 아냐!" "왜?"
"무조건 싫어!" "5년 전에 딱 한 번 본 사람 아냐?"
"그래, 얼굴도 잘 생각나지 않지만, 싫은 건 맞아."
이쯤 되면, 우리 삶이라는 게 도대체 무엇이 진실인지
모호해진다. 사건이 진실인지, 남은 감정이 진실인지
알 수 없다. 분명한 것은 당시의 사건이나 감정보다
그것을 붙들고 늘어지는 '무지몽매한 모호함의
수명'은 지겹도록 길다는 것이다.


- 김성수의《글쓰기 명상》중에서 -


* 무조건 좋은 것도 좋지 않습니다.
무조건 싫어하는 것은 더 안 좋습니다.
사리를 따지지 않고, 이성적 논리적 근거 없이
감정에 따라 판단하고 행동하는 것은 위험합니다.
진실을 가리고 관계를 파괴시킵니다. 좋고 싫은
감정은 언제나 있습니다. 그러나 '무조건'에
자신을 맡기면 스스로 무지몽매한
웅덩이에 내던지는 꼴입니다.

반응형

'아침편지' 카테고리의 다른 글

내가 만약에  (0) 2022.02.03
'사랑해. 당신이 좋아!'  (0) 2022.01.28
사랑에 사랑을 더하다  (0) 2022.01.26
독서를 사랑했던 그 남자  (0) 2022.01.25
독서와 글쓰기  (0) 2022.01.24
반응형

간혹 폭우나 안개, 눈 같은 게 자네의 앞길을 막을 때도 있겠지.
그러면 자네에 앞서 모든 조종사들이
그와 같은 상황을 겪었다는 사실을 생각하게.
그리고 스스로에게 그냥 이렇게 말해.
“다른 사람이 해냈다면 내가 해낼 가능성도 언제나 열려있는 것이다’라고 말일세.
- 생텍쥐페리, ‘인간의 대지’에서


과정이 너무 쉬우면 큰 성공은 어렵습니다.
누구나 다 할 수 있기 때문입니다.
누구나 다 할 수 있는 일에서의 성공 과실은 작을 수 밖에 없습니다.
결국 눈에 띌 정도의 커다란 성공 앞에는 그만큼 큰 고통,
장애, 역경이 놓일 수밖에 없습니다.
추구하는 목표가 커질수록 장벽도 높아집니다.

반응형
반응형

NLTK 에러시 - Resource punkt not found 일때 

아래 다운로드 추가하면 됩니다. 

 

import nltk
nltk.download()

import os
from konlpy.tag import Okt

import nltk
nltk.download()

from nltk import word_tokenize, pos_tag, ne_chunk 
sentence = 'Mike is working at IT Centre' 

# 토큰화, 품사태깅 pos_tag 후 -> ne_chunk 개체명인식 
sentence = pos_tag(word_tokenize(sentence)) 
print(sentence) 

# 개체명 인식 
sentence = ne_chunk(sentence) 
print(sentence)

반응형
반응형

NLTK 설치

저는 아나콘다 환경에서 파이썬을 사용하고 있으므로 이미 루트 가상환경에 NLTK가 설치가 되어있었습니다. KoNLPy와 다르게 별도의 설정등을 해줄 필요가 없습니다.아나콘다 내에서 가상환경을 따로 만들어 설치를 해줄시엔 해당 가상환경 activate 후에

> conda install nltk]
> conda update nltk

위 명령어를 입력하여 설치해주면 됩니다.

 

하지만 예제를 수행하면 여러 에러 메세지들을 볼 수 있습니다. 예를들어 nltk.download('words'), nltk.download('maxent_ne_chunker')를 하라는 등의 메세지가 뜨면 오류메세지에 뜬 명령어 그대로 입력해서 별도의 모듈들을 설치해주면 됩니다.

 

 

○ 예제 시행해보기

from nltk import word_tokenize, pos_tag, ne_chunk

sentence = 'Mike is working at IT Centre'

# 토큰화, 품사태깅 pos_tag 후 -> ne_chunk 개체명인식
sentence = pos_tag(word_tokenize(sentence))
print(sentence)

# 개체명 인식
sentence = ne_chunk(sentence)
print(sentence)

 

결과

# [('Mike', 'NNP'), ('is', 'VBZ'), ('working', 'VBG'), 
# ('at', 'IN'), ('IT', 'NNP'), ('Centre', 'NNP')]
# (S
#   (GPE Mike/NNP)
#   is/VBZ
#   working/VBG
#   at/IN
#   (ORGANIZATION IT/NNP Centre/NNP))

 

 

 

 

 

○ 몇 가지 기능 살펴보기

 

1. nltk.Text()

 

nltk.Text()는 자연어 데이터의 탐색을 편리하게 해주는 다양한 기능들을 제공합니다.

import nltk
from nltk.corpus import gutenberg
from nltk import regexp_tokenize

f = gutenberg.fileids()
doc_en = gutenberg.open('austen-emma.txt').read()

pattern = r'''(?x) ([A-Z]\.)+ | \w+(-\w+)* | \$?\d+(\.\d+)?%? | \.\.\. | [][.,;"'?():-_`]'''
tokens_en = regexp_tokenize(doc_en, pattern)

en = nltk.Text(toekns_en)

 

테스트를 하기 위해 NLTK에서 제공하는 제인오스틴의 소설 Emma데이터를 다운받습니다. 이후 문서를 토큰으로 나누는 작업을 해주었는데 한국어를 토크나이즈하거나 품사태깅, 개체명 태깅 등을 할 때는 KoNLPy를 이용하는 것이 훨씬 낫다고 봅니다.


예를 들어 NLTK에서 '나는 바보다'라는 문장에서 '바보다'라는 토큰의 개체명을 'Organization'으로 인식하는 등의 문제가 있습니다. 그래서 한국어 처리를 할 때에는 nltk를 데이터를 탐색하는 용도로 많이 사용하는 듯 합니다.

 

 

2. 그래프 그리기

 

en.plot(50) 

en문서의 50개의 토큰만 플롯으로 그려보았습니다.

 


en.dispersion_plot(['Emma','Frank','Jane'])

 


 

 

 

 

 

 

 

3. 문서 탐색

 

print(len(en.tokens)) # 토큰의 개수 확인
print(len(set(en.tokens))) # Unique 토큰의 개수 확인
en.vocab() # Frequency Distribution 확인
print(en.count('Emma')) # 'Emma'의 개수
en.concordance('Emma', lines=5) # 'Emma'가 들어있는 5개의 문장만 출력
en.similar('Emma')
en.similar('Frank') # 비슷한 단어 찾기
> 결과

> 191061
> 7927
> FreqDist({',': 12018, '.': 8853, 'to': 5127, 'the': 4844, 'and': 4653, 'of': 4278, '"': 4187, 'I': 3177, 'a': 3000, 'was': 2385, ...})
> 865
> Displaying 5 of 865 matches:
                                     Emma by Jane Austen 1816 ] VOLUME I CHAPT
                                     Emma Woodhouse , handsome , clever , and
both daughters , but particularly of Emma . Between them it was more the int
 friend very mutually attached , and Emma doing just what she liked ; highly e
r own . The real evils , indeed , of Emma situation were the power of havi
> she it he i harriet you her jane him that me and all they them there herself was hartfield be
mr mrs emma harriet you it her she he him hartfield them jane that isabella all herself look i me

 

그래프를 그리는 것 외에도 토큰의 개수나 frequency distribution등을 확인하여 데이터의 구조를 살펴보는데 좋은 기능들도 많이 제공하고 있습니다.

 

 


4. Chunking nltk.RegexParser()

 

Chunking 얕은 구문 분석, 음성 및 단구 (명사구와 같은)를 식별하는 것

tokens = "The little yellow dog barked at the Persian cat".split()
tags_en = nltk.pos_tag(tokens)

parser_en = nltk.RegexpParser("NP: {<DT>?<JJ>?<NN.*>*}")
chunks_en = parser_en.parse(tags_en)
chunks_en.draw()
결과

[('The', 'DT'),
 ('little', 'JJ'),
 ('yellow', 'NN'),
 ('dog', 'NN'),
 ('barked', 'VBD'),
 ('at', 'IN'),
 ('the', 'DT'),
 ('Persian', 'NNP'),
 ('cat', 'NN')]

 

 


5. 워드클라우드 그리기

 

import nltk
ko = nltk.Text(tokens_ko, name='대한민국 국회 의안 제 1809890호')

 한국어 예제를 하나 불러옵니다.

 

# 예제의 빈도분포(frequency distribution) 살펴보기

print(ko.vocab())
type(ko.vocab()) # 데이터타입, 속성목록 확인
dir(ko.vocab()) # 예제문서의 단어사전 살펴보기

data = ko.vocab().items()
print(data)
print(type(data)) # items()를 이용하면 빈도분포의 item 전체를 set형태로 확인 가능합니다.
> 결과

> FreqDist({'.': 61, '의': 46, '육아휴직': 38, '을': 34, '(': 27, ',': 26, '이': 26, ')': 26, '에': 24, '자': 24, ...})
> nltk.probability.FreqDist
> ['B',
 'N',
 ...
 'items',
 ...
 'pop',
 'popitem',
 'pprint',
 'r_Nr',
 'setdefault',
 'subtract',
 'tabulate',
 'unicode_repr',
 'update',
 'values']
 
 > dict_items([('명', 5), ('예상된', 3), ('하나', 1), ('11', 2), ('팀', 2), ...])
<class 'dict_items'>

데이터 탐색@@

 

import csv
with open('words.csv', 'w', encoding='utf-8') as f:
    f.write('word,freq\n')
    writer = csv.writer(f)
    writer.writerows(data)

탐색한 데이터 set을 words.csv라는 파일에 저장하여 워드클라우드를 그리는데 이용하도록 하겠습니다.

 

<!DOCTYPE html>
<html>
<head>
  <style>
    text:hover {
        stroke: black;
    }
  </style>
  <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
  <script src="d3.layout.cloud.js"></script>
</head>
<body>
  <div id="cloud"></div>
  <script type="text/javascript">
    var weight = 3,   // change me
        width = 960,
        height = 500;

    var fill = d3.scale.category20();
    d3.csv("words.csv", function(d) {
        return {
          text: d.word,
          size: +d.freq*weight
        }
      },
      function(data) {
        d3.layout.cloud().size([width, height]).words(data)
          //.rotate(function() { return ~~(Math.random() * 2) * 90; })
          .rotate(0)
          .font("Impact")
          .fontSize(function(d) { return d.size; })
          .on("end", draw)
          .start();

        function draw(words) {
          d3.select("#cloud").append("svg")
              .attr("width", width)
              .attr("height", height)
            .append("g")
              .attr("transform", "translate(" + width/2 + "," + height/2 + ")")
            .selectAll("text")
              .data(words)
            .enter().append("text")
              .style("font-size", function(d) { return d.size + "px"; })
              .style("font-family", "Impact")
              .style("fill", function(d, i) { return fill(i); })
              .attr("text-anchor", "middle")
              .attr("transform", function(d) {
                return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
              })
            .text(function(d) { return d.text; });
        }
      });
  </script>
</body>
</html>

위 코드를 index.html로 저장하고 words.csv가 있는 폴더내에 저장합니다.

 

python -m http.server 8888 

그리고 프롬프트웨 위 명령어를 입력하여 실행시켜준 뒤, http://localhost:8888로 접속하면,

 

생성된 워드클라우드를 확인할 수 있습니다.



출처: https://ebbnflow.tistory.com/147 [Dev Log : 삶은 확률의 구름]

반응형
반응형

코로나 라이브 - https://corona-live.com/

 

반응형
반응형

당신과 눈을 맞추며
당신의 이야기에 귀 기울인다
내가 먼저 웃음 지으면서
손 내밀어준다

당신이 어디가 불편한지
당신이 지금 무엇이 필요한지
당신의 사소함도 살펴보는 마음

사소함이 더 이상 사소함이 되지 않는
당신을 생각할수록 내 마음이 더 커지는
요술 방망이


- 이규초의 시집《사랑에 사랑을 더하다》에 실린
시〈배려〉중에서 -


* 미움에
미움을 더하면 최악입니다.
미움에 사랑을 더하면 최상입니다.
사랑에 사랑을 더하면 최상을 넘어
위대해집니다. 개인도 사회도 나라도
위대한 아름다움을 창조할 수 있습니다.

반응형

'아침편지' 카테고리의 다른 글

'사랑해. 당신이 좋아!'  (0) 2022.01.28
'무조건 싫어'  (0) 2022.01.27
독서를 사랑했던 그 남자  (0) 2022.01.25
독서와 글쓰기  (0) 2022.01.24
당신의 '해 봄'을 응원합니다  (0) 2022.01.24

+ Recent posts