반응형

인맥관리? 인맥의 함정


인맥이 필요하다는 말의 핵심은 단연코 시너지를 위해서다. 


시너지는 하나와 다른 하나가 만나 둘 이상의 효과를 넘어 서겠다는 뜻이다. 


1+1 > 2


아주 좋다.

그런데, 여기서 쉽게 간과되는 것이 있다. 


각각의 1, 즉 개별 주체가

'하나'로서의 온전한 스킬이나 능력을

보유하고 있어야 한다는 것이다.


나는 부족한데, 1이 안돼는데

어떤 사람을 만나서 결과를 극대화한다는 것은 


시너지가 이나라

요행이다.


그렇게 때문에 나이가 젊을수록,

특히 20대 초반에는

여기저기 기웃거리지 말고


자신의 역량을 임계치 이상으로 끌어올리는 

단오한 노력이 선행적으로 필요하다.


스스로 능력이 출중하다고 느끼는 사람들,

수치적으로도 실제 1 이상인 사람들이 서로 만나면


소통에 큰 문제가 있지 않는 한 

1+1 은 2 보다 반드시 크다.


부산스럽게 일하지 않는다 해도

바로 시너지가 난다.


진정한 시너지의 관점에서 볼 때, 


퇴근 후 또는 주말 술자리에 열심히 참여한다고 해서

생산적인 네트워킹(인맥)이 되는 것이 결코 아니다.


내가 온전히 서지 않는 한, '하나'가 되지 않는 한

술자리는 한낱 넷드링킹에 불과하다. 


Net-drinking, 그저 모여서 술 마시기.


술에 취해 "하하호호" 하는

술모임들을 네크워킹의 장으로 착각하면 위험하다.


허팡 바람 들어가듯, 헛된 망상으로 채워져

자신은 그렇지 않은데

뭔가 내공이 꽉 찬 사람인 듯한 환각에 빠질 수 있다.


환각에 빠지면?

꼭 사고가 나게 되어 있다. 


그러니 정신 반짝 차리고 공부하자.


실력의 향기는 자연그럽게 퍼지게 되어 있다.


내가 1이 되면 자연스럽게 사람들은 

나를 찾게 되어 있다. 


온라인이 지배하는 이 세상은 


정보가 협소하게 국한되었던

쌍팔년도(1988년)의 방법으로

인맥을 절대 쫓아다닐 필요가 없다.


다 알아서 찾아온다.


SNS,인터'넷' 덕분에

이제는 '네트'워킹에서 네트(연결망)는

누구나 접근할 수 있고 이용할 수 있게 되었다.


이제 우리에게 없는 것은 하나다.

워킹.(실력, Working)


그러니 제발

제대로 꾸준히

공부 (일)부터 하자.




...

반응형
반응형

단어 리스트 단어길이순, 단어순 정렬하기


txt = 'but soft what light in yonder window breaks'

words = txt.split()

t = list()

for word in words:

   t.append((len(word), word))


t.sort(reverse=True)


res = list()

for length, word in t:

    res.append(word)


print res



단어를 리스트에 담을때 길이도 같이 담는다. 


.sort() 는 첫번째 요소를 정렬하고 첫번째 요소가 동일하면 두번째 요소를 정렬한다. 


reverse=True 는 내림차순(큰것에서 작은것)으로 정렬해준다. 


 * 파일에 저장하기

with open( "./단어장파일.txt", "w", encoding='utf-8' ) as file_con:

    for length, word in t:

        file_con.append(word)


        


...

반응형
반응형

Python Numpy Tutorial



Table of contents:



반응형
반응형

최규민: 추천시스템이 word2vec을 만났을때 - PyCon Korea 2015





...

반응형
반응형


It's Easy (On Mac):

  1. Install easy_install  curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python
  2. Install pip  sudo easy_install pip
  3. Install regex module  pip install regex



한국어처럼 Unicode가 사용된 경우에는 위 방법을 이용할 수 없다. 대신 한국어 어절을 분리하고 싶을 때는 regex를 쓰면 편하다.2

>>> import regex
>>> regex.findall(ur'\p{Hangul}+', u'다람쥐 헌 쳇바퀴에 타고파.')
[u'\ub2e4\ub78c\uc950', u'\ud5cc', u'\uccc7\ubc14\ud034\uc5d0', u'\ud0c0\uace0\ud30c']

한국어, 영어, 한자어 등 여러 언어가 혼재된 경우에는 아래와 같이 어절을 분리할 수 있다.

>>> import regex
>>> regex.findall(ur'[\p{Hangul}|\p{Latin}|\p{Han}]+', u'동틀녘 sunlight이 作品!')
>>> [u'\ub3d9\ud2c0\ub158', u'sunlight\uc774', u'\u4f5c\u54c1']


반응형
반응형


문자열 비교


string1 = 'Hello'

string2 = 'hello'


if string1.lower() == string2.lower():

    print "같은 스트링"

else:

    print "다른 스트링"




반응형
반응형

Python List sort() Method


* 오름차순이 .sort(), 내림차순은 .sort(reverse=True)


Description

The method sort() sorts objects of list, use compare func if given.

Syntax

Following is the syntax for sort() method −

list.sort([func])

Parameters

NA

Return Value

This method does not return any value but reverse the given object from the list.

Example

The following example shows the usage of sort() method.

#!/usr/bin/python

aList = [123, 'xyz', 'zara', 'abc', 'xyz'];

aList.sort();
print "List : ", aList

When we run above program, it produces following result −

List :  [123, 'abc', 'xyz', 'xyz', 'zara']


반응형
반응형


단어 임베딩(Word Embedding)이란 텍스트를 구성하는 하나의 단어를 수치화하는 방법의 일종이다.

텍스트 분석에서 흔히 사용하는 방식은 단어 하나에 인덱스 정수를 할당하는 Bag of Words 방법이다. 이 방법을 사용하면 문서는 단어장에 있는 단어의 갯수와 같은 크기의 벡터가 되고 단어장의 각 단어가 그 문서에 나온 횟수만큼 벡터의 인덱스 위치의 숫자를 증가시킨다.

즉 단어장이 "I", "am", "a", "boy", "girl" 다섯개의 단어로 이루어진 경우 각 단어에 다음과 같이 숫자를 할당한다.

"I": 0
"am": 1
"a": 2
"boy": 3 
"girl": 4

이 때 "I am a girl" 이라는 문서는 다음과 같이 벡터로 만들 수 있다.

[11101]

단어 임베딩은 하나의 단어를 하나의 인덱스 정수가 아니라 실수 벡터로 나타낸다. 예를 들어 2차원 임베딩을 하는 경우 다음과 같은 숫자 벡터가 될 수 있다.

"I": (0.3, 0.2)
"am": (0.1, 0.8)
"a": (0.5, 0.6)
"boy": (0.2, 0.9) 
"girl": (0.4, 0.7)

단어 임베딩이 된 경우에는 각 단어 벡터를 합치거나(concatenation) 더하는(averaging, normalized Bag of Words) 방식으로 전체 문서의 벡터 표현을 구한다.

Feed-Forward 신경망 언어 모형 (Neural Net Language Model)

이러한 단어 임베딩은 신경망을 이용하여 언어 모형을 만들려는 시도에서 나왔다. 자세한 내용은 다음 논문을 참고한다.

V개의 단어를 가지는 단어장이 있을 때, 단어를 BOW 방식으로 크기 V인 벡터로 만든 다음 다음 그림과 같이 하나의 은닉층(Hidden Layer)을 가지는 신경망을 사용하여 특정 단어 열(word sequence)이 주어졌을 때 다음에 나올 단어를 예측하는 문제를 생각해 보자. 입력과 출력은 모두 BOW 방식으로 인코딩되어 있다.

이미지 출처: "word2vec Parameter Learning Explained", Xin Rong

입력 x가 들어가면 입력 가중치 행렬 WT이 곱해져서 은닉층 벡터 h가 되는데 x가 one-hot-encoding 된 값이므로 h 벡터는 입력 가중치 행렬 W의 행 하나가 된다.

h=WTx=viT

여기에서 i는 입력 벡터 x 의 값이 1인 원소의 인덱스이다. 즉, BOW 단어장에서 i번째 단어를 뜻한다.

벡터 h는 다시 출력 가중치 행렬 WT와 곱해져서 출력 벡터 y가 된다.

y=WTh

출력 가중치 행렬 W의 j번째 열을 vj라고 하면 출력 벡터 y의 j번째 원소의 값은 다음과 같다.

yj=vjTh

가중치 행렬을 갱신하는 최적화 공식을 살펴본다. 자세한 유도과정은 논문을 참조한다.

우선 출력 가중치 행렬의 갱신 공식은 다음과 같다.

vj(new)=vj(old)ηejh=vj(old)ηejviT

이 식에서 η는 최적화 스텝 사이즈, ej는 출력 오차가 된다. 이 공식에 따르면 벡터 vj는 vj 방향으로 수렴해 간다. 즉, i번째 단어와 j번째 단어가 연속하는 관계라면 vj가 vi와 유사한 위치로 수렴한다는 뜻이다.

다음으로 입력 가중치 행렬의 갱신 공식은 다음과 같다.

vi(new)=vi(old)ηkejwik

이 공식에 따르면 벡터 vi는 여러 vk 벡터의 가중합으로 수렴해 간다. 이렇게 단어간의 관계에 의해 i번째 단어를 뜻하는 vi의 값들이 연관성을 가지게 되는데 이 vi 벡터 값을 해당 단어에 대한 분산 표현 (distributed representation) , 벡터 표현 (vector representation) 또는 단어 임베딩 (word embedding)이라고 한다.

이미지 출처: https://www.tensorflow.org/versions/master/tutorials/word2vec/index.html

CBOW (Continuous Bag of Words) Embedding

위의 방식은 하나의 단어로부터 다음에 오는 단어를 예측하는 문제였다. 이러한 문제를 단어 하나짜리 문맥(single-word context)를 가진다고 한다.

CBOW (Continuous Bag of Words) 방식은 복수 단어 문맥(multi-word context)에 대한 문제 즉, 여러개의 단어를 나열한 뒤 이와 관련된 단어를 추정하는 문제이다. 즉, 문자에서 나오는 n개의 단어 열로부터 다음 단어를 예측하는 문제가 된다. 예를 들어

the quick brown fox jumped over the lazy dog

라는 문장에서 (thequickbrown) 이라는 문맥이 주어지면 fox라는 단어를 예측해야 한다.

CBOW는 다음과 같은 신경망 구조를 가진다. 여기에서 각 문맥 단어를 은닉층으로 투사하는 가중치 행렬은 모든 단어에 대해 공통으로 사용한다.

이미지 출처: "word2vec Parameter Learning Explained", Xin Rong

Skip-Gram Embedding

Skip-Gram 방식은 CBOW 방식과 반대로 특정한 단어로부터 문맥이 될 수 있는 단어를 예측한다. 보통 입력 단어 주변의 k개 단어를 문맥으로 보고 예측 모형을 만드는데 이 k 값을 window size 라고 한다.

위 문장에서 window size k=1인 경우,

  • quick -> the
  • quick -> brown
  • brown -> quick
  • brown -> fox

과 같은 관계를 예측할 수 있어야 한다.

이미지 출처: "word2vec Parameter Learning Explained", Xin Rong

word2vec

word2vec은 CBOW 방식과 Skip-Gram 방식의 단어 임베딩을 구현한 C++ 라이브러리로 구글에 있던 Mikolov 등이 개발하였다.

파이썬에서는 gensim이라는 패키지에 Word2Vec이라는 클래스로 구현되어 있다. nltk의 영화 감상 corpus를 기반으로 Word2Vec 사용법을 살펴보자.

우선 단어 임베딩을 위한 코퍼스를 만든다. 코퍼스는 리스트의 리스트 형태로 구현되어야 한다. 내부 리스트는 하나의 문장을 이루는 단어 열이 된다.

from nltk.corpus import movie_reviews
sentences = [list(s) for s in movie_reviews.sents()]
sentences[0]
[u'plot',
 u':',
 u'two',
 u'teen',
 u'couples',
 u'go',
 u'to',
 u'a',
 u'church',
 u'party',
 u',',
 u'drink',
 u'and',
 u'then',
 u'drive',
 u'.']

다음으로 이 코퍼스를 입력 인수로 하여 Word2Vec 클래스 객체를 생성한다. 이 시점에 트레이닝이 이루어진다.

from gensim.models.word2vec import Word2Vec
%%time
model = Word2Vec(sentences)
CPU times: user 12.2 s, sys: 400 ms, total: 12.6 s
Wall time: 7.33 s

트레이닝이 완료되면 init_sims 명령으로 필요없는 메모리를 unload 시킨다.

model.init_sims(replace=True)

이제 이 모형에서 다음과 같은 메서드를 사용할 수 있다. 보다 자세한 내용은 https://radimrehurek.com/gensim/models/word2vec.html 를 참조한다.

  • similarity : 두 단어의 유사도 계산
  • most_similar : 가장 유사한 단어를 출력
model.similarity('actor', 'actress')
0.87472425755991945
model.similarity('he', 'she')
0.85470770334392587
model.similarity('actor', 'she')
0.21756392610362227
model.most_similar("villain")
[(u'hero', 0.7978197932243347),
 (u'doctor', 0.7952470779418945),
 (u'actress', 0.7806568145751953),
 (u'performer', 0.775442361831665),
 (u'charming', 0.7602461576461792),
 (u'impression', 0.7583950757980347),
 (u'commoner', 0.7538788318634033),
 (u'janitor', 0.7536816000938416),
 (u'dude', 0.7528475522994995),
 (u'genius', 0.7506694793701172)]

most_similar 메서드는 positive 인수와 negative 인수를 사용하여 다음과 같은 단어간 관계도 찾을 수 있다.

he + (actress - actor) = she

model.most_similar(positive=['actor', 'he'], negative='actress', topn=1)
[(u'she', 0.2471558153629303)]

이번에는 네이버 영화 감상 코퍼스를 사용하여 한국어 단어 임베딩을 해보자.

import codecs

def read_data(filename):
    with codecs.open(filename, encoding='utf-8', mode='r') as f:
        data = [line.split('\t') for line in f.read().splitlines()]
        data = data[1:]   # header 제외
    return data

train_data = read_data('/home/dockeruser/data/nsmc/ratings_train.txt')
from konlpy.tag import Twitter
tagger = Twitter()

def tokenize(doc):
    return ['/'.join(t) for t in tagger.pos(doc, norm=True, stem=True)]

train_docs = [row[1] for row in train_data]
sentences = [tokenize(d) for d in train_docs]
from gensim.models import word2vec
model = word2vec.Word2Vec(sentences)
model.init_sims(replace=True)
model.similarity(*tokenize(u'악당 영웅'))
0.6062297706048696
model.similarity(*tokenize(u'악당 감동'))
-0.0041346659756955097
from konlpy.utils import pprint
pprint(model.most_similar(positive=tokenize(u'배우 남자'), negative=tokenize(u'여배우'), topn=1))
[(여자/Noun, 0.6258430480957031)]

더 많은 한국어 코퍼스를 사용한 단어 임베딩 모형은 다음 웹사이트에서 테스트해 볼 수 있다.


반응형

+ Recent posts