Open jaekeol opened 5 years ago
word-vector-example_2.sh
내부적으로 eval.py를 실행한다.
./fasttext print-idf-of-ngrams ./data/fil9 > ./jkc/ngrams.idf & cat ngrams.idf2 | ./idf.py > ngrams.idf2_sig sort -nk 2 -t " " ngrams.idf2_sig > ngrams.idf2_sig.sort head -n 30000 ngrams.idf2_sig.sort > ngrams.idf_sel
word자신도 ngram이 될 수 있기 때문에, main.cc를 수정하여, word도 substring에 포함되도록 하였다.
이렇게 해서, fasttext 러닝할때 사용할 weight 파일을 만든다. ngrams.idf_sel 이다.
마지막 head 는 유의미한 수준까지의 weight이다. 없으면 모두 1이다.
./select_idf.py ngrams.vec ngrams.idf > ngrams.idf.sel
./makevec_with_idf.py ngrams.idf.sel ngrams.vec > made_idf.vec
(1) tanh 를 이용하여 root와 affix part로 확률적으로 나눈다. (2) affix.vec 에 affix vector가 기록된다. (3) detail.out 에 affix로 많이 가게된 ngram이 기록된다.
이렇게 한다음 evaluation을 하면, 두 vector의 sim을 기록한다. affix 쪽 sim과 root 쪽 sim을 잘 이용하여 하나의 vector를 만들어 낼 수 있어야 한다.
python3 eval.py -m made.vec -d ../data/rw/rw.txt > sim_result.idf python3 eval.py -m made_idf.vec -d ../data/rw/rw.txt > sim_result.org python3 eval.py -m affix.vec ../data/rw/rw.txt > sim_result.affix
이렇게 해보면, 성능이 더 안좋아 지는것을 보게 되는데, affix와 root를 적절히 결합하면 더 좋아질 것으로 본다.
애초에 이렇게 학습이 되었기 때문일 것으로 판단된다. 처음 학습할때 이 자료가 들어갈 수 있어야 하지 않을까.. 한다.
./word-vector-idf.sh 을 수행하면 된다. ngrams.idf_sel 파일을 사용하게 되는데, shell과 같은 위치에 두어야 한다
word-vector-idf.sh을 가지고 실험한 결과 기본에서 42 였던 것이 43으로 증가하였다. !!!!
(1) idf 가지고 뽑기 ./one_analysis.py ngrams_new.vec allurement ../ngrams.idf_sel > allurement.new_ngram sort -nrk 3 allurement.new_ngram > allurement.new_ngram.sort
(2) idf없이 그냥 뽑기 ./one_analysis.py ngrams.vec allurement ../ngrams.idf_null > allurement.ngram sort -nrk 3 allurement.ngram > allurement.ngram.sort
(1) original 은 fastText/word-vector-example_ws353.sh (2) idf 는 [irteam@csm0018 fastText_ra]$ ./word-vector-example_ws353.sh
(1) ./word-anal.sh > rseult2/lt 로 실행하였다. (2) original 에서도 마찬가지로 한다.
./word-ana.sh > anal.result & 로 fasttext_ra와 fasttext에서 실험하였다. 둘을 비교해 보면 semantic 과 syntatic 에서 차이를 볼 수 있다.
fasttext 내부 함수를 사용해야 한다! 소스 수정하였고, 아래와 같이 사용한다. [idf] cat anal_test.txt | ./fasttext analogies ./result2/fil9.bin ngrams.idf_sel 1 > result/anal.predict ./anal_eval2.py
[org] cat anal_test.txt | ./fasttext analogies ./result2/fil9.bin 1 > ./result/anal.predict ./anal_eval2.py
cut -d " " -f 1,2,3 ./data/wordanal/word_..... .txt | awk '{print $2,$1,$3}' > ./data/wordanal/a.txt vi로 열어서, %s/.*/\L&/g 로 모두 소문자로 바꾼다. 그다음 anal.txt 로 바꾼다.
디멘젼을 늘리면서 analogy 테스트를 하였다. 늘릴수록 정확도가 떨어진다. >.< ./word-anal-200.sh
(1) ./word-vector-enwidf.sh data 에 있는 enwiki 전체로 학습하는 것이고, idf 는 못구해서 기존것을 사용한다.
(1)영어 위키를 전체 받아다가, 입력만들기 get_wikimedia.sh 을 통해 받으면, 파싱이 잘 안된다. 일단. zip 파일 받아다가, wikifil.pl 로 파싱해야 된다. cat [zip-xmlfile] | perl wikifil.pl > enwiki.txt
(2) 그 다음 head 로 잘라서 words 300M, 780M 정도로 사용한다. head -n 20000000 enwiki.txt > enwi.20M ./word-vector-wikien.sh
(1) data 는 ./data/wikimedia/ 에 만들었고, 여기있는것을 head 해서 사이즈 맞추면 된다. 현재 60만에서 실험에 사용했던것과 비슷한 크기가 구해진다. (2) 그 자료를 ./data 폴더에 넣고.. (3) 우선, fasttext하고 RW 하는게.. word-vector-wikien.sh 을 돌린다. 이때 RESULTDIR 변수만 잘 바꾸면된다. (4) 그 다음 WS353자료 결과를 얻기 위해서, word-vector-example-ws353.sh을 돌린다. (5) 그 다음 word-anal.sh을 돌려서, analogy test를 한다.
(1) ngrams.idf_sel 은 RESULTDIR에 있어야 하므로, result dir 하나 만들고 ngrams.idf_sel을 카피한다. (2) word-vector-idf.sh을 돌려서 bin 파일을 구하고, RW 결과를 낸다. (3) word-vector-example-ws353.sh을 돌려서 ws결과를 낸다. (4) word-anal.sh을 돌려서 analogy test를 한다.
analogy test할때 상위 30000개만 보도록 소스를 수정하였다. 이렇게 해야 올라간다. 이부분 소스코드를 세련되게 바꿀 필요가 있다. 614 for (int32_t i = 0; i < 30000; i++) {
IDF에서 통계자료를 꺼내야 한다. 정말로, affix 부분이 .. idf가 높은지 말이다.
idf_stat.py
result_idfvar/에서 cat ngrams_idf.sel | ./idf_stat.py 로 실행한다.
idf_stat_weighted.py cat ngrams_idf_sig.sort | ./idf_stat3.py
word와 word의 ngram vector를 출력
cat [queryfile] | ./fasttext print-all-ngrams [binaryfile]
fasttext의 main.cc를 변경하여 만들었다.