Tekhartha의 인공지능 기술블로그

TF-IDF

|


TF-IDF는 Term frequency - Inverse Document Frequency의 약자로, 문서에 나온 단어의 개수와 관련된 모델이다. 보통 이 개념을 사용한 Vector Matrix를 생성하여 기초적인 검색에 활용한다.

TF는 특정 단어가 문서에서 얼마나 자주 등장하는지 빈도를 나타내고, DF는 단어 자체가 전체 문서들에서 얼마나 자주 나타내는지를 뜻한다. IDF는 DF의 역수 값이다. TF-IDF값은 TF값에 IDF를 곱해서 나타낸다.

간단한 예시로 계산을 진행하면,

d1 : This picture is my favorite.
d2 : I love this contury.
d3 : Choose your favorite picture.

위와 같이 3개의 문서가 있다고 가정할 때,

각 단어의 빈도수를 표로 나타내면 다음과 같다 :

  this picture is my favorite I love contury choose your
d1 1 1 1 1 1 0 0 0 0 0
d2 1 0 0 0 0 1 1 1 0 0
d3 0 1 0 0 1 0 0 0 1 1
TF 2 2 1 1 2 1 1 1 1 1

(한 문서 안에 같은 단어가 여러 번 나오면 그에 따라 빈도수도 올라간다)

각 단어별 TF는 위와 같이 단어가 모든 문서군에서 총 몇 번 나왔는지를 세 주면 된다.

IDF는 문서의 수(여기서는 3개니까 3)를 단어의 빈도로 나눠주고 거기에 밑을 2로 하는 log를 취해 주면 된다.

그러니까 this의 IDF는 $ IDF_{this} = log_{2}(3/2) = 0.584 $ 가 된다.

만약 단어의 빈도수가 0일 경우, 0으로 나누는 문제를 방지하기 위해서 분모에 1을 더해서 계산하기도 한다.

(이렇게 해야 되는 이유에 대해서는 조금 더 자세한 탐색이 필요하다.)

위의 표의 마지막 열에 IDF를 추가하면 다음과 같이 된다 :

  this picture is my favorite I love contury choose your
d1 1 1 1 1 1 0 0 0 0 0
d2 1 0 0 0 0 1 1 1 0 0
d3 0 1 0 0 1 0 0 0 1 1
TF 2 2 1 1 2 1 1 1 1 1
IDF 0.584 0.584 1.584 1.584 0.584 1.584 1.584 1.584 1.584 1.584

이제 TF-IDF 값은 단순히 TF와 IDF 두 값만 곱해서 표현하면 된다.

추가적으로 나중의 문서 유사도 검색을 위해서 문서의 크기를 알아야 하는데, 문서의 크기(length)는 문서의 모든 단어들에 등장하는 TF-IDF 값들의 제곱의 합의 L2-norm으로 구할 수 있다.

위의 표의 d1~d3 행을 TF-IDF 값으로 표현하고 length를 추가하면,

  this picture is my favorite I love contury choose your length
d1 1.168 1.168 1.584 1.584 1.168 0 0 0 0 0 3.018
d2 1.168 0 0 0 0 1.584 1.584 1.584 0 0 2.981
d3 0 1.168 0 0 1.168 0 0 0 1.584 1.584 2.783

이 표를 벡터 매트릭스로 해석하고 새로운 문서와 유사도를 측정할 수 있다.

언어 모델과 N-gram

|


[언어 모델(Statistical Language Model)]

NLP 분야에서는 언어를 컴퓨터가 이해하기 쉽도록 개발된 여러 가지 모델이 존재하는데, 이를 일컬어 언어 모델이라고 한다. 각기 다른 방식을 사용하지만, 기본적으로 모든 언어 모델은 다음과 같은 질문에 답하기 위한 모델이다 :

1) 해당 문장이 나올 확률이 얼마인가?

2) 이전 단어들이 주어졌을 때, 다음 단어가 나올 확률이 얼마인가?

이 두 질문에 답을 하는 언어 모델들을 통해 단어들의 조합이 적절한지, 단락 내의 해당 문장이 얼마나 적합한지 등을 알아낼 수 있다.


그렇다면 w1 ~ w5 5개의 연속된 단어로 이루어진 문장 W가 있다고 가정해보자. 이 때 W가 나타날 확률은

$P(W) = P(w1,w2,w3,w4,w5)$

로 나타낼 수 있다.

그럼 P(w1), P(w2) 같은 것들은 어떻게 알 수 있는가?

기본적으로 자연어 처리에서의 단어가 나올 확률은 이전 단어가 나왔을 때 그 다음 해당 단어가 나올 조건부 확률로 정의된다. 그러니까

으로 표현할 수 있단 말.

이 조건부확률들을 joint하면 P(W)도 알아낼 수 있다.

이렇게 표현할 수 있다. 조금 더 세련되게 표현하면

이런 조건부 확률을 계산하려면 엄청나게 많은 양의 코퍼스가 있어야 하겠다.

그런데 문제, 해당하는 단어나 문장이 코퍼스 안에 아예 없다면? 아예 확률 계산 자체가 불가능해지는 문제가 생긴다.

이를 일반화하여 조금이라도 개선하는 방법론이 N-gram이다.

[N-gram]

N-gram이란, 입력된 문자열을 N개의 기준 단위로 자르는 방법이다. 이 때 기준 단위는 문자 단위가 될 수도, 단어 단위가 될 수도, 어절 단위가 될 수도 있다. (정하기 나름이라는 거다)

위에서 기술한 조건부 확률을 이용한 방법은 코퍼스에 해당하는 문장이 없으면 아예 카운팅이 안 되지만, N-gram을 이용하면 문장 전체가 없어도 부분으로 쪼개서 탐색하기 때문에 이런 경우가 줄어든다.

ex) “I am a boy”를 단어 단위 2-gram으로 자르면,

{“I am”, “am a”, “a boy”} 의 집합으로 나타내어진다.

이 기법은 빈도 분석, 검색, 자연어 처리 등에 널리 이용된다.

프로그램은 문자열 입력 - N-gram 만들기 - 빈도순 출력 순으로 만들면 된다.

[적절한 n의 개수 정하기]

당연하게도, n을 크게 잡으면 정확도가 높아지지만 실제 훈련 코퍼스에서 해당 데이터를 count할 수 있는 확률은 적어진다. n을 작게 잡는다면 count 자체는 잘 되겠지만 근사의 정확도는 점점 실제의 분포와 멀어진다. 적절한 n을 선택하는 것 또한 하나의 주제가 될 수 있다.

음정(Interval)

|


[음정]

음정은 두 음 사이의 거리를 말한다. 코드 구성과 멜로디 움직임 파악 시 가장 기본이 되며, 음악 이론의 기초가 된다.

두 음 사이 음정을 알아내는 방법은 기준음 자신을 1도로 생각하고 목표음까지 온음의 개수와 반음의 개수를 세어 맞는 음정을 찾아낸다.

음정의 종류는 다음과 같다 :

1) 완전음정(Perfect Interval, ‘P’)

2) 장음정(Major Interval, ‘M’)

3) 단음정(Minor Interval, ‘m’)

4) 증음정(Augmented Interval, ‘aug’)

5) 감음정(Diminished Interval, ‘dim’)

‘다장조의 도’를 기준으로 1, 4, 5, 8도는 완전음정이라 하고 2, 3, 6, 7도는 장음정이라 한다. 장음정을 반음 낮추면 단음정이 되고, 완전음정을 반음 올리면 증음정이 되고, 완전음정을 반음 낮추면 감음정이 된다.

반음거리 완전/장/단 증/감
0 완전1도 감2도
1 단2도 증1도
2 장2도 감3도
3 단3도 증2도
4 장3도 감4도
5 완전4도 증3도
6 해당없음 증4도/감5도
7 완전5도 감6도
8 단6도 증5도
9 장6도 감7도
10 단7도 증6도
11 장7도 감8도
12 완전8도 증7도

나무위키에서 반음거리에 따른 음정을 정리해 놓은 표를 보았는데, 잘 정리되어 있어 가져왔다.

위 표와 같이, 같은 반음거리를 가지고 있다 하더라도 때에 따라 완전/장/단음정으로 불릴 수도 있고, 증/감음정으로 불릴 수도 있다. (초보 단계에서는 보통 완전/장/단으로 해결한다.)

위 표에서 같은 행에 위치한 음정들은 이명동음정이라고 부른다. 음정은 똑같지만 때에 따라 불리는 이름이 다르기 때문에 그렇게 부른다.

[음정의 전회]

음정의 전회란 밑음을 1옥타브 위로 올리거나 위음을 1옥타브 밑으로 내려 음정을 자리바꿈시키는 것. 원래 음정과는 다른 새로운 음정이 생겨나게 된다.

완전음정이 전회되면 완전음정이 되고, 장음정이 전회되면 단음정이 되며, 증음정이 전회되면 감음정으로 바뀐다. 이와 반대의 경우도 마찬가지.


[음정의 전회 공식]

원래 음정 + 전회 음정 = 9

완전음정 <—> 완전음정

장음정 <—> 단음정

증음정 <—> 감음정

ex) 장3도를 전회하면 단6도, 증4도를 전회하면 감5도가 된다.


가끔 치기 어려운 코드 등이 나오면 음정을 전회해서 나오는 쉬운 코드를 사용하기도 한다.

=======

layout: post title: 음정(Interval) categories : [Music]

tags : [Music, 화성학]



[음정]

음정은 두 음 사이의 거리를 말한다. 코드 구성과 멜로디 움직임 파악 시 가장 기본이 되며, 음악 이론의 기초가 된다.

두 음 사이 음정을 알아내는 방법은 기준음 자신을 1도로 생각하고 목표음까지 온음의 개수와 반음의 개수를 세어 맞는 음정을 찾아낸다.

음정의 종류는 다음과 같다 :

1) 완전음정(Perfect Interval, ‘P’)

2) 장음정(Major Interval, ‘M’)

3) 단음정(Minor Interval, ‘m’)

4) 증음정(Augmented Interval, ‘aug’)

5) 감음정(Diminished Interval, ‘dim’)

‘다장조의 도’를 기준으로 1, 4, 5, 8도는 완전음정이라 하고 2, 3, 6, 7도는 장음정이라 한다. 장음정을 반음 낮추면 단음정이 되고, 완전음정을 반음 올리면 증음정이 되고, 완전음정을 반음 낮추면 감음정이 된다.

반음거리 완전/장/단 증/감
0 완전1도 감2도
1 단2도 증1도
2 장2도 감3도
3 단3도 증2도
4 장3도 감4도
5 완전4도 증3도
6 해당없음 증4도/감5도
7 완전5도 감6도
8 단6도 증5도
9 장6도 감7도
10 단7도 증6도
11 장7도 감8도
12 완전8도 증7도

나무위키에서 반음거리에 따른 음정을 정리해 놓은 표를 보았는데, 잘 정리되어 있어 가져왔다. 위 표와 같이, 같은 반음거리를 가지고 있다 하더라도 때에 따라 완전/장/단음정으로 불릴 수도 있고, 증/감음정으로 불릴 수도 있다. (초보 단계에서는 보통 완전/장/단으로 해결한다.) 위 표에서 같은 행에 위치한 음정들은 이명동음정이라고 부른다. 음정은 똑같지만 때에 따라 불리는 이름이 다르기 때문에 그렇게 부른다.

[음정의 전회]

음정의 전회란 밑음을 1옥타브 위로 올리거나 위음을 1옥타브 밑으로 내려 음정을 자리바꿈시키는 것. 원래 음정과는 다른 새로운 음정이 생겨나게 된다.

완전음정이 전회되면 완전음정이 되고, 장음정이 전회되면 단음정이 되며, 증음정이 전회되면 감음정으로 바뀐다. 이와 반대의 경우도 마찬가지.


[음정의 전회 공식]

원래 음정 + 전회 음정 = 9

완전음정 <—> 완전음정

장음정 <—> 단음정

증음정 <—> 감음정

ex) 장3도를 전회하면 단6도, 증4도를 전회하면 감5도가 된다.


가끔 치기 어려운 코드 등이 나오면 음정을 전회해서 나오는 쉬운 코드를 사용하기도 한다.

Flaming - 정성하

|


[Played by 정성하]
(Tuning : Baritone)
정성하의 정규4집 "Monologue" 5번 트랙에 수록되어 있는 곡이다.
정성하 본인이 직접 작곡한 곡이다.
인트로의 하모닉스 부분에서는 조금씩 타오르다가,
코러스의 스트럼 부분은 이런 이미지가 상상된다.
정열, 의지 같은 개념이 생각나는 곡이라 참 좋아라 한다. 입시준비할 때 자주 들었던 곡이다.
바리톤 튜닝이라 스탠다드 튜닝으로 치면 영상보다 톤이 높아지는데, 좀더 청량한 (푸른 불꽃?) 느낌을 받는다. 실제 무대에서 칠 때는 저음이 강조되는 미디움 게이지 줄을 사용하여 몇 음이라도 내리는 것을 권장한다. (곡의 핵심은 저음부 스트럼과 하모닉스이다.)
연주 관련하여 가장 어려운 부분은 단연 코러스의 옥타브 및 스캥크 주법이다. 다른 줄을 뮤트하고 4번 줄과 6번 줄만 소리를 내어야 하는데, 사람마다 뮤트하는 방법이 다르고, 깔끔하게 뮤트하기 위해 많은 연습이 필요하다.
비슷한 느낌의 곡으로는 The Eastlight의 김준욱 군이 작곡한 "Wille" 를 추천한다.

블로그에서 펼치기/접기 기능 구현하기

|


블로그에 펼치기와 접기 기능을 구현하는 방법을 포스팅한다.

먼저 head.html 파일에 들어가서, <head> 부분에 다음과 같은 구문을 추가한다 :

<script language='JavaScript' type='text/javascript'> 
function layer_toggle(obj) { 
    if (obj.style.display=='none') obj.style.display = 'block'; 
    else if (obj.style.display=='block') obj.style.display = 'none'; } 
</script> 

다음, 해당 기능을 구현할 때 다음과 같은 html 구문을 이용한다.

<div id="A" style="display: block;"> 
<a onclick="layer_toggle(document.getElementById('A')); layer_toggle(document.getElementById('B')); return false;" href="#">접힌 상태</a> 
</div> 
<div id="B" style="display: none;"> 
<a onclick="layer_toggle(document.getElementById('A')); layer_toggle(document.getElementById('B')); return false;" href="#">펼친 상태</a> 
<span style = "line-height:50%"><br></span>
펼친 후 보여질 내용
</div>

실제 구현하면 다음과 같아진다.

간-단.