Open jaekeol opened 5 years ago
2019.02.12
'impurity' 에 대해 ngram과 cosine sim을 구해보았다.
실행 : cat impurity.ngrams | ./sim.py
결과를 보면, <impu 가 높고 imp, 명사형에서 높은거..
impurity 0.446378990471
<im 0.56236329478
<imp 0.358878028981
<impu 0.610022672815
<impur 0.40894497571
imp 0.650306999198
impu 0.577554745731
impur 0.433355474165
impuri 0.410349949255
mpu 0.456357251898
mpur 0.355139372982
mpuri 0.40379503103
mpurit 0.407645559432
pur 0.503982509392
puri 0.385602188788
purit 0.280710371898
purity 0.175465901477
uri 0.485504975828
urit 0.0892022517108
urity 0.271262706083
urity> 0.248674212296
rit 0.657800123842
rity 0.0335346662532
rity> 0.36413743855
ity 0.670883746011
ity> 0.616599702048
ty> 0.572832063734
TF-IDF 를 쓰면 더 좋아질가?
중의어가 여러개 양산되는 것인데, 그것을 어떻게 극복하는 것인가?
2019.02.23
kmenas로 similarity구하는 대상 word들의 ngram을 클러스터링해서, root 와 suffix가 묶이는지 본다. 명령어 : cat ngrams.vec | ./kmeans.py > km.out
kmeans 결과에서 특별한 것들이 발견되지만, root와 affix를 발견할 정도는 아니다.
2019.02.23 input data 구하는 부분이 잘못되어 수정하였다. wikifil.pl 의 맨 마지막 라인에 print $_ . "\n" 으로 변경함
2019.02.23 TF-IDF 를 사용해서 품지을 올릴 수 있을지 실험해 보려한다.
IDF를 구했다. 매우 작은 값을 갖는 것들이 나오는데 이 값들을 사용하지 않으면 좋아질 것으로 판단된다. ngrams.idf.sort
STAT정보는 아래와 같다. cat ngrams.idf.sort | ./idf_stat.py mean 10.254736227443733 std 1.6255410823710115 median 10.9551 skew -2.21120393697 skewtest SkewtestResult(statistic=-923.6617033697332, pvalue=0.0)
10점 정도가 평균인데, 6번 정도 문서에서 나온것이 평균, 중앙값이다. skew를 보면, 오른쪽으로 치우친 모습임을 알 수 있다.
./compute_diff.pl > diff.result [예제] tripods tripod 0.941 0.928 1 0.072 0.0590000000000001 skidding skid 0.910 0.872 0.962 0.09 0.0519999999999999 root가 같은 경우에 더 높은 점수를 준다. diagonal heterosexual 0.268 0.390 0 0.39 0.268 형용사형이라는 것 때문에 점수가 높았던것이 감소한다.
그러니까.. root의 similarity와 그외의 similarity를 따로 재서 합치면 좋아질거라고 본다.
./makevec_with_idf_little.py ngrams.idf.sel ngrams.vec > made_idf.vec.little ./sim_eval.sh
affix의 유사도를 좀 더해주면 더 좋아지려나?
(1) scarcenss vs rarity ,, corroding vs decay 두 개의 root와 affix 유사도가 함께 높으므로 가점을 한다. 일반적인 cosine쓰지말고,, 다르게 계산하자.
(2) root x root, affix x affix .. 등 4사분면을 모두 살펴서, polluted 인지 아닌지 살피고,, 값을 올려줄지 말지 결정.
(1) computeHidden hidden_ vector는 대상 word의 ngram을 모조리 sum해서 normalize한 vector이다. ( wi 이용 - ngram matrix )
(2) computeLoss - binaryLogistic hidden_과 주변 word 의 내적을 하고 sigmoid한게 score이다. ( wo 이용 - word 의 matrix ) alpha = ( 1-score ) * learnigRate 만큼 조정하려고 한다.
wo 는 hidden ( 즉 ngram의 합) 에 alpha를 곱한 즉, 작은 hidden 방향으로 움직여 준다.
(3) update grad 는 vector로 wo 에 있는 word 값에다가 alpha 곱한값 즉,, word의 작은 vector 방향으로, ngram을 움직이려고 하는것이다. wi ( ngram)을 grad 방향으로 움직여 준다.
그러므로, score를 idf 를 weight로 곱해서 사용하는 방식으로 바꾸려면, 첫째, hidden을 만들때 idf 곱해서 만들어야 한다. 둘째, update할때, word가 바뀌는 것은 상관없다. hidden을 이용하기 때문이다. 셋째, update할때, ngram을 바꾸려 할때는,, hidden을 바꾸려는 것이기 때문에, hidden을 다시 ngram으로 내릴때는 weight를 가지고 내려와야 할것같다. 이 부분은 확인 필요하다.
probabilistic inverse document frequency 를 이용하기로 한다. 마이너스 부터 양수까지 펼쳐지기때문에, sigmoid함수랑 잘 어울린다. idf-value = sigmoid ( probablistic idf ) = sigmoid ( log ( ( n - freq) / freq ) )
(0) idf 값을 모델이 알도록 initialize 하기
(1) Hidden 만들때 weight사용하기
(2) wi 업데이트할때 weight사용하기
(1) idf값을 읽어드릴 수 있도록 fasttext.cc 를 수정하였다. readIdf 라는 함수를 추가했다. 이때, ngram의 index를 구하는 부분이 어려웠고, 한번확인하였으나, 재차 확인이 필요하다.
(2) hidden을 만들때, weight 를 참조하도록, model.cc를 변경하였다.
(3) wi 업데이트할때 weight만큼 업데이트 하도록 model을 변경하였다.
(4) output vector만들때도 weight를 참조하도록 main.cc를 변경하였고, vector.cc도 변경하였다. const 함수여서 생긴문제가 있었다. ( getWordVector : const제거한 함수로 해결하였다)
idf에 변형없이 사용하는 것이 결과가 더 좋았다.
(1) origianl 에서 ./word-anal.sh > result/lt 19544.0 10193 9351.0 이므로, 대략 52%
(2) idf 에서 ./word-anal.sh > result/lt 19544.0 9895 9649.0 이므로 대략 50.6%
뭔가 실험을 잘못했을 수도 있다.
(1) original version 실험진행중
(1) 논문에 보면, 780M 데이터로 640 디멘션일때 성능이 좋다고 나와있다. 이것을 확인하려고 한다.
(2) 그 다음 idf사용한 버젼을 그대로 따라 해보려고 함. 이때 성능이 올라야함,
git clone "https://github.com/benathi/multisense-prob-fasttext" 로 코드 받아서 수정시작한다.
./train_text8_multi.sh 이용해서 모델만들고 python eval_model_wordsim.py --modelname ./modelfiles/multi_text8_e10_d300_vs2e-4_lr1e-5_margin1 이렇게 sim test 하였다.
결과는 Result DataFrame Dataset sub sub2 sub-maxsim 0 SL 27.116255 9.231124 27.014270 1 WS 60.322466 34.320081 64.150658 2 WS-S 65.194663 36.573338 66.196390 3 WS-R 57.189281 34.223905 61.065991 4 MEN 66.296172 30.443716 68.652553 5 MC 55.095684 39.430353 58.878506 6 RG 58.202839 37.967021 56.548393 7 YP 34.560108 -1.322934 38.716567 8 MT-287 64.634530 42.245588 64.285414 9 MT-771 56.891606 25.814161 56.541948 10 RW 36.858887 0.064312 34.685984
웨이트를 idf로 fix하지 않고, learning하기로 한다. grad_를 이용하여 ngram_vector를 업데이트 하는 부분에서 weight도 dimension으로 나눈값으로 gradient descent 하기로한다.