Bert Examples

Posted 2021. 4. 30. 08:55

1) huggingface bert를 많이 사용

huggingface.co/transformers/notebooks.html

 

🤗 Transformers Notebooks

You can find here a list of the official notebooks provided by Hugging Face. Also, we would like to list here interesting content created by the community. I...

huggingface.co

2) best practice: bert를 classification에 사용

colab.research.google.com/github/huggingface/notebooks/blob/master/examples/text_classification.ipynb

 

Text classification on GLUE

Run, share, and edit Python notebooks

colab.research.google.com

- 여러 class로 분류
- 일정량의 학습 데이터가 있으면
- 미리 학습된 bert model에 해당 분류기를 학습시켜서 사용

 

3) bert + kmeans

- 입력을 bert로 embedding 해서 사용

- 두가지 예 모두 Sentence-BERT 사용

 

영어 예

theaidigest.in/how-to-cluster-text-documents-using-bert/

 

How to cluster text documents using BERT - theaidigest.in

Cluster text documents using BERT embeddings and Kmeans. See how you can apply the K-means algorithm on the embedding to cluster documents.

theaidigest.in

한국어 예

github.com/BM-K/KoSentenceBERT#clustering

Write your message and submit

프로젝트 중 알게된 edit distance 비교 방법이 있어서 정리해본다.

(사실 매번 Damerau–Levenshtein distance만 사용했었다...)



jaro similarity(jaro distance)


jaro distance는 두 단어간의 transpositions에 집중한 알고리즘이다.

(insertion, deletion, substitution은 고려하지 않음)


transposition은 간단히 위치 교환이라고 생각하면 된다.


아래와 같이 두 단어가 있을 때, transpositions은 총 2회 발생한다.

(a=> b, b => a)


word1  : a ---- b

word2 : b ---- a



jaro distance는 두 단어가 비슷할수록 1에 가까운 값을 가지고, 다를수록 0에 가까운 값을 가진다.

(두 단어가 같으면 1, 다르면 0이다)




s1, s2는 각 문자열을 의미하고

|s1|은 s1의 길이를 의미하고

m은 match된 문자 개수를 의미하고

t는 transposition이 필요한 개수의 절반을 의미한다.


ex)

CRATE, TRACE


s1의 길이는 5

s2의 길이는 5

m의 개수는 3

t는 transposition이 2번 필요한데, 그 절반이니 2/2 = 1


1/3 * ( 5/5 + 5/5 + (3-1)/3) = 0.62


추가로 matching이라고 판단하는 범위는 같은 위치이거나 혹은 아래 범위내에서만 매칭이라고 본다.

(아무래도 너무 멀리 있으면 안되서... 그런 것 같다)


jaro-winkler similarity(jaro-winkler distance)

jaro-winkler의 경우는 prefix matching에 대한 가중치를 추가한 것으로


이렇게 생겼다.

simj는 jaro distance를 의미하고
l은 prefix lengnth(최대 4)
p는 scaling factor인데 0.1이 기본값이고, 0.25가 최대값이다(0.25를 넘게 주면 similarity가 1을 넘을 수 있다).

distance를 구할 때는 dw = 1 - simw 이다.


참고

wiki : https://en.wikipedia.org/wiki/Jaro–Winkler_distance


잘 정리해놓은 블로그(한글) : http://qtqtlanakim.tistory.com/11


apache common code : http://commons.apache.org/proper/commons-text/jacoco/org.apache.commons.text.similarity/JaroWinklerDistance.java.html

Write your message and submit

noisy channel model and spell correction

Posted 2018. 5. 8. 11:30

잠깐 보고 정리해봅니다...

(기억력의 한계를 극복해보고자...)


ref : https://web.stanford.edu/~jurafsky/slp3/5.pdf

일단 noisy channel model은 "original word가 noisy channel에 의해 noisy word(distorted 됐다고 표현)가 되고, 이를 decoder를 통해 original word와 가장 비슷한 것을 추측"하는 모델인데...


스펠러와 연결지어 생각해보면...


1) misspelled word : noisy word(noisy channel을 통해 distorted된 word)

2) noise는 substitutions or other changes to the letters(original word에서 distorted된 상태가 된 원인)

3) channel은 correct word를 찾아내는 model로 보면 됨


호옥시, 잘못된 내용이면 알려주세요.

적극 수정하겠습니다!

Write your message and submit

Perplexity in LM

Posted 2017. 1. 16. 18:15


뭔가 아는데, 설명을 못하는 상황이라서 개념 정리한 내용입니다.

지금 필요한 내용이 LM의 perplexity를 어떻게 계산할 것인지에 대한 내용이라 LM perplexity를 계산하는 관점에서 정리했습니다.


Perplexity란?

Perplexity

  • 수식

  • 설명

    • b : 보통 2를 사용(왜 2를 보통으로 사용하는지는 모르겠으나, 왠지 엔트로피를 구할 때 bits로 표현 가능한 정보량을 설명하는 것과 연관이 있을 것 같음)

    • N : 전체 test event 개수

    • q : 확률 모델, LM에서는 LM으로 구하는 확률을 의미

    • x : test event

  • 의미
    • q모델에서 test event를 표현하기 위해 필요한 평균 비트 수를 나타냄
  • 기타
    • cross entropy를 이용해서 구할 수도 있음
      • cross entropy는 두 확률 모델간의 entropy를 나타낸다고 볼 수 있음
      • 수식
      • 설명

        • H  : cross entropy

        • ~p : n / N (n은 x가 나타난 횟수를 의미)

        • q  : 확률 모델 

LM에 대한 Perplexity

    확률 모델을 LM에 맞춰 변경하면 됨

  • 설명

    • w1 ... wN : N-gram

    • H()       : entropy 계산

    • m()       : 확률 모델

참고


Write your message and submit

회사분이 추천해 준 논문인데, 배울 점이 많은 것 같다.

수작업으로 만든 데이터와 기계적으로 추출한 데이터의 상관관계를 비교하는 부분이나,
한국어 발음과 키보드간 거리를 결합하여 사용한 부분,
연산비용을 계산하여 swap에 우선순위를 둔 부분 등이 마음에 든다.

논문

요약

  • 가중치를 적용한 교정 거리 연산 사용
  • 베이지언 노이즈 채널 모델 + 한국어 특유의 속성 추가
  • 야후 로그에서 ed2까지의 데이터를 추출 후, 오타 -정타 쌍을 추출 후 계산
  • ㅇㅑ후, 야후 의 keystroke 구분하기 위해 divider라는 개념 사용(d~i~gn~, di~gn~)
  • 연산비용이 같을 때는 swap을 우선 적용
  • ed1에서 한글 자소의 교체에 대부분의 편집 연산이 일어남
  • 키보드 상의 거리 + 발음 유사성(ex, ㅔ,ㅐ)
  • 세션을 고려한 사용자 입력 질의어 => 8번 논문을 좀 더 살펴봐야...
    • 같은 세션내의 두 질의어의 평균 출현 위치 정보와 편집거리를 기반으로 구축
    • 이 부분에 대해서는 잘 이해되지 않는다... 표3
  • 그라디언트 부스티드 결정트리? 이건 뭐지?
  • (실제 서비스에 사용했다는)한글의 여러 속성? 뭘까?
  • 추가로 필요한 내용
    • 복합명사 분해를 통해 추가적인 교정 가능성(시네스+영화관 => 씨너스+영화관)
    • 네비게이셔널 질의어에 대한 처리(dign => 야후)


Write your message and submit

Moses 학습 & 실행

Posted 2015. 7. 5. 07:17

이번 글에서는 moses를 이용하여 번역 모델을 학습하고, 실행하는 방법에 대해 공유한다.

moses 공식 사이트에 있는 baseline 실행하고, 정리한 내용이다.

baseline url : http://www.statmt.org/moses/?n=Moses.Baseline



이 글을 검색해서 보고 있다는 것 자체가 번역모델이 무엇인지, 그리고 학습이 왜 필요한지에 대해 알고 있는 분이라 생각하여 why에 대한 부분은 생략하고 바로 실행하는 부분에 대해 설명한다.


학습과정을 나누면 5단계로 구성되어 있다.(baseline 기준)


1. 말뭉치를 전처리하고, moses 학습 형태로 변경

2. 언어 모델(lanaguage model)을 빌드

3. 번역 모델 학습 

4. 파라미터 튜닝

5. 번역 모델 바이너리화


* 영어를 한국어로 번역하기 위해, 번역모델을 학습하는 방법이다.

* 학습에 사용할 말뭉치가 준비되어 있다고 가정한다.

  (말뭉치 : eng_kor.learn.kor, eng_kor.learn.eng)


1. 말뭉치 전처리


# tokenisation

$ ~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en \

    < eng_kor.learn.eng \

    > eng_kor.learn.tok.eng


$ ~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l ko \

    < eng_kor.learn.kor \

    > eng_kor.learn.tok.kor


# truecaser : 말뭉치에서 각 단어의 대소문자 빈도를 조사하여 대소문자 변환을 위한 모델 빌드

$ ~/mosesdecoder/scripts/recaser/train-truecaser.perl \

    --corpus eng_kor.learn.tok.eng \

    --model truecase-model.en


$ ~/mosesdecoder/scripts/recaser/train-truecaser.perl \

    --corpus eng_kor.learn.tok.kor \

    --model truecase-model.ko


# truecasing : truecasing에서 빌드된 모델을 토대로 대소문자 변환

$ ~/mosesdecoder/scripts/recaser/truecase.perl \

    --model truecase-model.en \

    < eng_kor.learn.tok.eng \

    > eng_kor.learn.true.eng


$ ~/mosesdecoder/scripts/recaser/truecase.perl \

    --model truecase-model.ko \

    < eng_kor.learn.tok.kor \

    > eng_kor.learn.true.kor


# limit sentence length to 80(with direction)

$ ~/mosesdecoder/scripts/training/clean-corpus-n.perl \

    eng_kor.learn.true en ko \

    eng_kor.learn.clean 1 80


2. 언어 모델(lanaguage model) 빌드 : target language에 대해 언어 모델을 빌드한다.


# build lm (eng to kor, using ko) : tri-grams 빌드

$ ~/mosesdecoder/bin/lmplz -o 3 --discount_fallback < eng_kor.learn.true.ko > kor.arpa


# make binarise : 바이너리화

$ ~/mosesdecoder/bin/build_binary kor.arpa kor.blm


3. 번역 모델 학습 : 학습 말뭉치의 크기에 따라 시간이 오래 걸리는 작업이므로, 백그라운드로 실행하는 것이 좋다.

-mgiza, -cores는 필요에 따라 설정하여 사용하면 된다.


$ ~/mosesdecoder/scripts/training/train-model.perl \

    -root-dir train \

    -corpus eng_kor.learn.clean \

    -f en -e ko -alignment grow-dial-final-and -reordering msd-bidirectional-fe \

    -lm 0:3:kor.blm:8 \

    -mgiza -cores 12 \

    -external-bin-dir ~/mosesdecoder/tools/


4. 파라미터 튜닝


- 튜닝 데이터 준비


# tokenisation

$ ~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en \

    < eng_kor.tune.eng \

    > eng_kor.tune.tok.en


$ ~/mosesdecoder/scripts/tokenizer/tokenizer.perl -l ko \

    < eng_kor.tune.kor \

    > eng_kor.tune.tok.ko


# truecasing

$ ~/mosesdecoder/scripts/recaser/truecase.perl \

    --model truecase-model.en \

    < eng_kor.tune.tok.en \

    > eng_kor.tune.true.en


$ ~/mosesdecoder/scripts/recaser/truecase.perl \

    --model truecase-model.ko \

    < eng_kor.tune.tok.ko \

    > eng_kor.tune.true.ko


- 파라미터 튜닝


$ ~/mosesdecoder/scripts/training/mert-moses.pl \

    --working-dir=mert-work \

    --decoder-flags="-threads 12" \

    eng_kor.tune.true.en eng_kor.tune.true.ko \

    ~/mosesdecoder/bin/moses ./train/model/moses.ini --mertdir ~/mosesdecoder/bin/


5. 번역 모델 바이너리화
cmph를 설치했을 경우에 가능한 과정이다.
phrase table, reordering table을 바이너리화하여, 로딩 속도를 향상 시킬 수 있다.

# compress
$ ~/mosesdecoder/bin/processPhraseTableMin \
    -in train/model/phrase-table.gz \
    -nscores 4 \
    -out phrase-table

$ ~/mosesdecoder/bin/processLexicalTableMin \
    -in train/model/reordering-table.wbe-msd-bidirectional-fe.gz \
    -out reordering-table

이렇게 한 다음에는 mert-work/moses.ini에서
PhraseDictionaryMemory => PhraseDictionaryCompact로 변경
PhraseDictionaryCompact Path, LexicalReordering path = 바이너리화 되어 있는 파일로 변경해야 한다.

* 실행
$ ~/mosesdecoder/bin/moses -f mert-work/moses.ini

끝.


Write your message and submit

Moses 설치

Posted 2015. 6. 29. 10:49

moses는 smt(statistical machine translation) tool이다.

예전에 더 어려웠던 것 같은데, 설치 과정이 많이 단순해졌다.


직접 경험했던 설치 과정을 공유한다.


일단 링크부터...

http://www.statmt.org/moses/?n=Development.GetStarted


위 사이트를 가서 한 단계씩 따라한다면 아주 쉽게 설치할 수 있다...

(사실 여러번의 삽질을 통해 쉽게 설치할 수 있다는 것을 알았다.)


1. moses download & release 3.0 선택


$ git clone https://github.com/moses-smt/mosesdecoder.git


$ git checkout RELEASE-3.0


처음에 릴리즈 된 버전을 선택하지 않고, 사용했다가 설치를 못했었는데...

내가 받았던 그 버전이 ... 한참 수정중인 버전이였다. ㅠㅠ


릴리즈 관련 링크: http://www.statmt.org/moses/?n=Moses.Releases


2. boost_1_55_0 설치(moses 사이트에 있는 설명 그대로... 하면 된다.)


설치 문서에 있는 링크를 통해 1_55_0을 설치한다.

1.48 버전 이상 있다면 따로 설치하지 않아도 되는데, 따로 설치하는 것을 추천한다.


$ wget http://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fboost%2Ffiles%2Fboost%2F1.55.0%2F&ts=1389613041&use_mirror=kent


$ tar zxvf boost_1_55_0.tar.gz


$ cd boost_1_55_0/


$ ./bootstrap.sh


$ ./b2 -j4 --prefix=$PWD --libdir=$PWD/lib64 --layout=system link=static install || echo FAILURE


3. moses 설치


$ ./bjam --with-boost=$prefix/boost_1_55_0 -j4


2번에서 설치한 boost를 --with-boost를 이용하여 지정하고 설치한다.


4. mgiza 설치


http://www.statmt.org/moses/?n=Moses.ExternalTools#ntoc3


여기에 있는 내용이다.


$ git clone https://github.com/moses-smt/mgiza.git

$ cd mgiza/mgizapp

$ cmake .

$ make; make install


그리고, bin 파일의 모든 파일과 $prefix/mosesdecoder/tools에 복사하고

scripts/merge_alignment.py 파일 또한 $prefix/mosesdecoder/tools에 복사한다.


이렇게 하면 일단 설치는 완료 된다!


이제 잘 되는지 확인을 해봐야 하니...sample을 다운로드 받고, 실행해본다.


$ cd ~/mosesdecoder


$ wget http://www.statmt.org/moses/download/sample-models.tgz


$ tar xzf sample-models.tgz


$ cd sample-models


$ cd ~/mosesdecoder/sample-models


$ ~/mosesdecoder/bin/moses -f phrase-model/moses.ini < phrase-model/in > out


이렇게 해보면, in 파일에 있는

das ist ein kleines haus가 this is a small house로 번역 된 것을 볼 수 있다.


끝.

Write your message and submit

nltk pos tagger

Posted 2015. 6. 16. 14:58

 import nltk


tokenized_sentence = nltk.word_tokenize('I want to something to drink')

tagged_sentence = nltk.pos_tag(tokenized_sentence)


print tagged_sentence


[('I', 'PRP'), ('want', 'VBP'), ('to', 'TO'), ('something', 'NN'), ('to', 'TO'), ('drink', 'VB')]


이렇게 사용하면 간단히 사용 가능~

Write your message and submit

english pos tagger

Posted 2015. 4. 21. 20:27

english pos tagger 찾기


NLP 역사가 오래된 만큼, 여러 tagger 들이 존재한다.


http://aclweb.org/aclwiki/index.php?title=POS_Tagging_(State_of_the_art)


여기에 잘 정리되어 있다.

몇멏 tagger에 대해 테스트 해 볼 예정이다.


Write your message and submit

베이지안 정리(Bayes' Theorem)

Posted 2014. 10. 20. 12:20

베이즈 정리에 대해 잘 안다고 말하는 정도가 어느정도인지...

이 정도를 안다고 하는 건 들어는 봤다고 말하는 느낌이다.

하지만, 일단 이해한 부분까지 정리해본다.

http://darkpgmr.tistory.com/62 의 글을 통해 이해했다.


* 조건부 확률 = 베이지안 룰 = 베이지안 정리 = 베이지안 법칙


P(x | z) = p( z | x) * p( x ) / p( z )


- 용어 정리

p(x | z) : 사후 확률(posterior probability), 어떤 사건(관측값) 이후에 나타나는 확률

p(z | x) : 우도, 가능도(liklihood), 표본이 모집단을 대표하는 정도?(이 부분에 대해서는 공부가 더 필요하다)

p( x ) : 사전 확률(prior probability), 어떤 사건(관측값) 이전에 나타나는 확률

p( z ) : 관측값에 대한 확률


여기에서 우리가 궁금한 건 x 이다.(x의 확률, x는 불확실성을 계산할 대상)


x를 구하기 위해서는 ML, MAP 라는 개념을 사용해서 구할 수 있다.

(x를 구한다는 것은 어떤 클래스, 즉 z가 x에 더 잘 어울릴지?를 구하는 과정이다)


ML(Maximum liklihood) : liklihood를 최대로 하는 x를 찾는 것

MAP(Maximum A Posterior) : Posterior probability를 최대로 하는 x를 찾는 것


수식으로 정리하면 다음과 같다.


ML : x = argmax(x) = P(z | x)

MAP : x = argmax(x) = P(x | z) = P( z | x )P( x )


여기서 P(x)를 사라지게 한다면, ML 과 MAP가 같은 값으로 볼 수 있는데,

이렇게 하는 경우는 x(즉, x를 계산할 수 없을 때나 모를 때),

모든 P(x)(P(x1) = P(x2) = ... = P(xn))에 대해 같은 값으로 보고, 이를 제거하여 계산하기도 한다.

  1. 다크pgmr

    | 2014.10.20 14:10 신고 | PERMALINK | EDIT | REPLY |

    안녕하세요. 트랙백 따라 왔습니다.
    그런데, 수식으로 정리하신 부분에서 ML과 MAP 수식이 혹시 서로 바뀐 건 아닌지요..
    한번 확인해 보시면 좋을 것 같습니다.

  2. hexists

    | 2014.10.21 10:52 신고 | PERMALINK | EDIT |

    감사합니다.
    틀린 부분 수정했습니다^^;

Write your message and submit