새로이 lm을 추가하고 싶은데.. 도움 요청 드립니다.

340 views
Skip to first unread message

AronGs

unread,
Oct 11, 2021, 7:03:55 AM10/11/21
to zeroth-help
항상 도움 많이 받고 있습니다.
저번에 데이터셋을 추가 학습한 것에 이어서 음성 인식기가 사용될 도메인에 맞게 lm을 건드려보고 싶습니다.

kaldi 사이트에 안내되어 있는 data prepare 관련해서도 몇 번 정독을 했지만 어떻게 진행을 해야 할 지 감이 오질 않더라구요..!
data/local/lm에 위치한 run_task.sh를 이용해서 기존 zeroth의 말뭉치와 합치고 싶은데,
이를 위해서 어떤 파일을 어떻게 전처리를 해두고 어디에 위치시켜야 할지.. 기본적인 것부터 모르겠습니다. 
run_task.sh 스크립트를 분석해보려고 하니 morfessor는 작동하지도 않고, 찾아보니 이전 버전을 사용하라고 하시는데 pip freeze 통해서 보니 Morfessor 자체를 찾아볼 수도 없더라구요..? 애초에 쉘 스크립트로 실행하는데 pip로 찾는 것이 맞나 싶을 생각이 들 정도로 무지합니다 ㅠ..
여태까지 진행한 것은 관련 도메인의 언어들을 크롤링해서 모아놓은 것이 전부네요.
관련되서 알고 계시는 내용이 있다면 약간의 조언 부탁드립니다..! 매번 감사합니다!!

AronGs

unread,
Oct 11, 2021, 8:49:45 AM10/11/21
to zeroth-help
 엇.. 갑자기 Morfessor가 실행이 잘 되네요..? 더 삽질하고 오겠습니다!

2021년 10월 11일 월요일 오후 8시 3분 55초 UTC+9에 AronGs님이 작성:

AronGs

unread,
Oct 14, 2021, 7:51:51 AM10/14/21
to zeroth-help
data/local/lm/run_task.sh를 통해서 하면 morfessor 오류가 발생하길래,
run_task.sh 에서 51번째 줄 Split corpus 이전에 존재하는 작업을 전부 command창에서 실행하여 필요한 파일을 만들어 둔 뒤
해당 라인들을 주석 처리하여 실행하였습니다.

data/local/lm/BuildLM/_corpus_task
에 새로 추가하고 싶은 텍스트 파일(lm_add_test.txt)을 넣어두고,
run_task.sh의 morfessorUpdate=true로 설정한 후 실행시켰더니
다음과 같은 로그를 볼 수 있었습니다.

start at 2021-10-14-18-22
Split corpus --------------------------------------------------------------
  Copy buildLM/_corpus_task_/lm_add_test.txt.aa into buildLM/_corpus_task_/rawCorpus.1
Text normalization starts ---------------------------------------------------
Finding Uniq. words for morpheme analysis --------------------------------------
Accumulate statistics into: uniqWordList ------------------------------------------
  total uniq. word count: 162770
  portion of freq.== 1 word: 34.98 %
Pruning uniqWordList for Morfessor training -----------------------------------------

이후에 계속해서
의 136번째 줄이 출력될 것으로 기대했지만 실행되지 않고 종료가 되었습니다.
다짜고짜 죄송하지만 여기서 왜 종료가 되는 것인지 의문입니다..
$1, $2 와 같은 인자가 존재하는 것을 보니 혹시 run_task.sh를 실행할 때 추가적으로 명시해야 하는 다른 인자가 존재하는 건가요?
또 해당 스크립트를 최종적으로 완료하였을 때 생기는 *.lg.(tg, fg, tgsmall, fgmed ... ).arpa.gz 을 가지고 학습 스크립트를 재실행하면 올바르게 적용이 되는 것인지도 여쭤보고 싶습니다!
마지막으로 약 13GB의 텍스트 데이터가 기존 제로스 압축 파일에 담겨 있던 언어 모델을 만드는데 사용되었다고 하는데, 크롤링을 통해 제가 모은 텍스트는 500메가도 안될 정도로 작습니다.
이런 작은 데이터로도 해당 도메인에 최적화 시키는데 무리가 없을까요..?

긴 글 읽어주시고, 매번 도움 주셔서 감사합니다 :)
2021년 10월 11일 월요일 오후 9시 49분 45초 UTC+9에 AronGs님이 작성:

이승현

unread,
Oct 15, 2021, 1:16:12 AM10/15/21
to zeroth-help
$1, $2와 같은 인자는 awk의 패턴이나 액션에서 사용되는 인자이고 run_task.sh를 실행할 때 입력하는 인자는 아닙니다.
왜 갑자기 종료가 되었는지는 이상하긴 하네요.
혹시 중간 파일은 어디까지 생성이 되었나요? uniqWordList.nonhangul까지 생성이 완료되었나요?

해당 스크립트를 완료한 후 생기는 arpa 파일들로 학습을 진행하면 올바르게 적용은 됩니다.
그런데 이를 zeroth의 LM과 합치고 싶으시면 run_merge.sh를 추가로 실행하시면 됩니다.

데이터 용량은 어느 정도 있는 게 당연히 좋겠지만
충분히 도메인에 특화되어 있으면 해당 도메인에서 괜찮은 성능을 보일 수 있습니다.
그런데 직접 해보지 않으면 쉽게 알기는 어렵겠더라구요 ㅎㅎ

2021년 10월 14일 목요일 오후 8시 51분 51초 UTC+9에 AronGs님이 작성:

AronGs

unread,
Oct 15, 2021, 2:35:11 AM10/15/21
to zeroth-help
data/local/lm/run_task.sh 스크립트 실행 후 buildLM/_corpus_task_ 의 내용입니다!
_corpus_task_/
├── lm_add_test.txt
├── lm_add_test.txt.aa
├── normedCorpus.1
├── num_jobs
├── rawCorpus.1
├── uniqWordList
├── uniqWordList.hangul
├── uniqWordList.hangul.remained
├── uniqWordList.nonhangul
└── uniqWords.1
lm_add_test.txt는 제가 크롤링을 통해 모은 한국어 내용이며, 약 5만줄 정도로 한 줄은 약 200~300자의 한국어 텍스트로 구성되어 있습니다.
답변해주신대로 uniqWordList.nonhangul까지 생성 되었고, 해당 파일의 내용은 lm_add_test.txt에서 한글이 아닌 글자를 이미 다 걸러서 그런지 빈 파일이었습니다.

아래 사진은 어디서 오류가 나는지를 확인해보기 위해 echo를 삽입한 스크립트 입니다.
141, 149번줄에 아무 텍스트를 삽입했습니다.
asdasdsa.png

아래 사진은 실행 결과를 저장한 로그입니다.
asdggg.png

보시는 바와 같이.. 141번째 줄부터 실행이 되지 않습니다..
uniqWordList.nonhangul 파일이 생성된 것으로 보아 140번째 줄까지는 문제가 없는 것 같은데.. 도대체 뭐가 문제인지..

run_task.sh에서 zeroth_morfessor.seg 파일을 요구하길래 합치는 과정까지 포함되어 있는 줄 알았더니
따로 run_merge.sh를 해주어야 하는군요!
데이터 용량도 적어서 걱정하고 있었는데 명쾌한 답변 감사합니다 :) 매번 새로운 것 많이 배워갑니다!
2021년 10월 15일 금요일 오후 2시 16분 12초 UTC+9에 이승현님이 작성:

이승현

unread,
Oct 15, 2021, 3:11:09 AM10/15/21
to zeroth-help
140번째 줄 grep -v -E '[가-힣]+ [0-9]+' $srcFile > $inFile2 에서 문제가 생겨서 중단이 된거네요.
아마 코드 위쪽에 보시면 set -e가 있을 겁니다.
이 명령어는 스크립트 진행 중 어떤 명령어가 0이 아닌 값을 리턴하면 스크립트를 중단하게 만듭니다.

140번째 줄을 실행할 때 $srcFile에서 해당 패턴을 찾지 못했으므로 grep은 1을 반환합니다.
set -e가 없었다면 그냥 그렇구나 하고 진행되었겠지만 set -e가 있었기 때문에 중단이 된 겁니다.

해결 방법은 set -e를 주석 처리하시거나 140번째 줄이 무조건 0을 반환하도록 && exit 0을 넣으시면 해결될 것 같습니다.
2021년 10월 15일 금요일 오후 3시 35분 11초 UTC+9에 AronGs님이 작성:

AronGs

unread,
Oct 15, 2021, 3:36:52 AM10/15/21
to zeroth-help
앗.. set -e가 스크립트마다 들어있길래 뭔가 했더니 그런 역할이군요.

추가적으로 질문을 드리고 싶은데, run_task.sh를 통해서 실행을 하면

스크립트에서
    "Fetch Morfessor segment model from the official Zeroth project"과
     Morfessor model training (Update) 부분에서 morfessor 관련 명령줄이 있는데, 
AttributeError: 'BaselineModel' object has no attribute '_segment_only' 가 나타납니다.

그래서 현재까지 스크립트가 어떻게 이루어지는지 볼 겸 하면서
쉘 스크립트에서 한 줄씩 커맨드라인으로 옮겨서 실행하고 있는데, 이런 경우에는 morfessor 관련 에러가 등장하지 않습니다.

혹시 스크립트로 실행을 하는 것과, 그냥 콘솔 창에서 진행하는 것이 무슨 차이가 있는 지 알 수 있을까요?
콘솔 창에서 진행할 때는 path.sh나 cmd.sh, set -e 등을 실행하지 않고 단지 변수값만 올바르게 설정해줍니다.
혹시 이것도 set -e 문제일까요?
2021년 10월 15일 금요일 오후 4시 11분 9초 UTC+9에 이승현님이 작성:

이승현

unread,
Oct 15, 2021, 3:47:31 AM10/15/21
to zeroth-help
https://groups.google.com/g/zeroth-help/c/tjttl0UwcSc
이 글을 참고하시면 될 것 같습니다.

쉘 스크립트로 실행했을 때와 커맨드 라인으로 실행했을 때 차이가 나는 이유는
아마 path.sh때문인 것 같습니다.

path.sh에서 kaldi 관련된 환경변수를 설정하는데 그냥 커맨드 라인에서는 이를 설정하지 않고 실행되서 차이가 나는 것 같네요.
아무튼 정확하지는 않지만 의심이 가는 부분은 path.sh뿐인 것 같습니다.
정확하지는 않으니 set -e 옵션을 주지 않고 스크립트로 실행해 보시는 것도 좋을 것 같습니다.
2021년 10월 15일 금요일 오후 4시 36분 52초 UTC+9에 AronGs님이 작성:

AronGs

unread,
Oct 15, 2021, 5:31:07 AM10/15/21
to zeroth-help

매번 빠른 답변 감사합니다.
더.. 삽질하고 오겠습니다 :)
2021년 10월 15일 금요일 오후 4시 47분 31초 UTC+9에 이승현님이 작성:

AronGs

unread,
Oct 15, 2021, 10:25:03 AM10/15/21
to zeroth-help
답변 덕분에 Morfessor 관련 문제를 해결했습니다.
사실 이전에 저 글을 봤었는데 morfessor 버전을 낮췄으나 그게  run_task.sh를 타고 실행하게 되면
path.sh에서 실행되는 kaldi/tools/env.sh  덕분에 kaldi에 지정되어있는 morfessor가 실행이 되더군요..
kaldi/tools/env.sh 에서 MORFESSOR 변수를 whereis morfessor 의 결과값으로 설정하여 해결할 수 있었습니다.

말씀해주신대로 141번 라인에 && Exit 0 을 추가하니 관련 오류도 해결이 되었습니다.


다만,  morfessorUpdate=true로 설정하고 실행했을 시에 
Morfessor model training(Update) 부분에서 발생하는
FileNotFoundError, buildLM/_corpus_/morfessor.model.pickled 입니다.

생성되는 morfessor.model.pickled, morfessor.model.txt, morfessor.lexicon 세 종류의 파일은
run_task.sh 를 실행하면 data/local/lm 디렉토리와 data/local/lm/buildLM/_corpus_task_ 에 생성됩니다.
_corpus_  디렉토리에는 스크립트를 실행하는 동안 그 어떤 파일도 생성되지 않았습니다.

run_task.sh 를 실행하기 전에, _corpus_task_ 에 준비한 텍스트 파일을 넣어두는 것 이외에는 buildLM 하위 폴더에서 어떤 작업도 하지 않았습니다.
이외에 추가적으로 해야하는 작업이 있나요?
혹은, morfessorUpdate 값을 true로 설정한 후 실행되는 스크립트 경로에서 _corpus_ 를 _corpus_task_로 바꾸어 주는 것이 맞나요?
morfessorUpdate 값을 true로 설정했을 때 실행되는 스크립트 내용이 어떤 작업이 이루어지는지 궁금합니다.
morfessorUpdate 값을 false로 진행하는 것과 어떤 차이가 있을까요?

갑자기 많은 질문이 생겨버렸네요..
시간이 괜찮으시다면 도움 부탁드립니다 :)
2021년 10월 15일 금요일 오후 6시 31분 7초 UTC+9에 AronGs님이 작성:

이승현

unread,
Oct 17, 2021, 9:59:53 PM10/17/21
to zeroth-help
제가 알기로 morfessorUpdate 옵션이 True이면 
기존의 morfessor 모델이 존재할 때(_corpus_/morfessor.model.pickled) 이를 불러와,
전처리가 완료된 새로운 텍스트 데이터들로 morfessor 모델을 업데이트 하는 걸로 알고 있습니다.

단순히 run_task.sh만 실행했을 때 기존의 morfessor 모델(zeroth를 통해 다운로드받은)을 사용하실 겁니다.
모델 파일 이름은 zeroth_morfessor.seg 입니다.
이 모델을 불러와서  morfessor.model.pickled(zeroth_morfessor.seg 복사한 것), morfessor.model.txt, morfessor.lexicon 이 세 파일을 data/local/lm 아래에 생성합니다.
_corpus_task_ 아래에 심볼릭 링크를 생성하게 됩니다.

morfessorUpdate가 False이면 이 파일들을 사용하게 되고,
True이면 업데이트를 진행해 새로운 모델 파일을 생성해 사용합니다.

만약 업데이트를 원하신다면 그냥 buildLM/_corpus_ 아래에 morfessor.model.pickled 파일을 복사하시면 됩니다.
그러면 기존의 zeroth에서 제공한 morfessor 모델을 커스텀 데이터로 업데이트하게 됩니다.
꼭 필요한 것은 아니나 도메인에 따라서 필요할 수도 있습니다.

이런 구조로 만든 이유는 아마
원래 run.sh를 먼저 실행해 general domain LM을 생성한 후
run_task.sh를 실행해 task domain LM을 생성해 필요에 따라 업데이트를 하는 방향으로 사용하기 위해서라고 생각이 듭니다.

run.sh를 실행하면 general domain LM은 _corpus_ 디렉터리 아래에 생성이 됩니다. 
그러나 일반 사용자들은 zeroth에서 다운로드받아 사용하기 때문에 이 디렉터리 아래에 파일이 따로 없는 것이죠.

아무튼 어떤 옵션을 주어도 큰 상관은 없을 것이라 생각이 듭니다.
그러나 성능에 영향을 줄 수 있는 부분이라 두 방향으로 진행해 각각 테스트해보는 것도 좋을 것 같습니다.

2021년 10월 15일 금요일 오후 11시 25분 3초 UTC+9에 AronGs님이 작성:

AronGs

unread,
Oct 18, 2021, 7:39:52 AM10/18/21
to zeroth-help
상세한 설명 감사합니다.
보다 확실한 이해를 위해서는 조금 더 해봐야 알 것 같습니다..

현재 morfessorUpdate를 false로 한 상태로 data/local/lm/run_task.sh를 진행하여 생성된 파일이
corpus.lm.(tg, fg, tgmed, tgsmall).arpa.gz 파일이 buildLM/_corpus_task_ 폴더에 위치해있습니다.

이 상태에서 bulidLM/_corpus_ 폴더에 zeroth.lm.(tg, fg, tgmed, tgsmall).arpa.gz 파일을 위치시켜 놓고
data/local/lm/rum_merge.sh 스크립트에서 general_domain_lm 변수를  _corpus_폴더에 위치한
zeroth.lm.tg.arpa.gz 및 zeroth.lm.fg.arpa.gz를 가리키게 변경한 후 run_merge.sh 스크립트를 실행시켜서
data/local/lm/buildLM 폴더에 mixed_~~~.lm.(tg, fg, tgsmall, tgmed).arpa.gz 파일을 얻어냈습니다.
1. 해당 파일들을 모델에 적용하려면 data/local/lm 폴더에 위치한 zeroth.lm.(tg, fg, tgmed, tgsmall).arpa.gz 파일들을 mixed 파일로 대체해주면 되는 것인가요?
zeroth_lexicon 및 zeroth_morfessor.seg 파일은 그대로 사용해도 문제가 없는지 궁금합니다.

또 추가적으로 생긴 의문이 du -sh 명령어로 확인한 파일들의 용량이
zeroth.lm.fg.arpa.gz 은 4.2G
zeroth.lm.tg.arpa.gz 은 2.7G
zeroth.lm.tgmed.arpa.gz 은 64M
zeroth.lm.tgsmall.arpa.gz은 25M 입니다.

하지만 새로 추가된 파일은
mixed_~~~.lm.tg.arpa.gz 2.7G
mixed_~~~.lm.fg.arpa.gz 2.6G
mixed_~~~.lm.tgmed.arpa.gz 21M
mixed_~~~.lm.tgsmall.arpa.gz 14M 입니다.

2. 크롤링해서 구한 텍스트 파일의 크기가 59M 정도인데, 용량이 작아서 크게 변화가 없다고 한들
fg.arpa.gz 파일의 용량이 감소한 것은 이해가 가질 않습니다.

혹시 도움이 되실까 싶어서 실행했던 로그를 남겨봅니다!
항상 감사합니다.

다음은  data/local/lm/run_task.sh를 실행한 결과입니다.
중간에 buildLM/_scripts/buildLexcion.sh 에서 오류가 한 번 발생했었습니다.
task.png
task_2.png
다음은 data/local/lm/rum_merge.sh 를 실행한 결과입니다.
run_merge.png
2021년 10월 18일 월요일 오전 10시 59분 53초 UTC+9에 이승현님이 작성:

이승현

unread,
Oct 19, 2021, 12:12:09 AM10/19/21
to zeroth-help
>>> 1. 해당 파일들을 모델에 적용하려면 data/local/lm 폴더에 위치한 zeroth.lm.(tg, fg, tgmed, tgsmall).arpa.gz 파일들을 mixed 파일로 대체해주면 되는 것인가요?
zeroth_lexicon 및 zeroth_morfessor.seg 파일은 그대로 사용해도 문제가 없는지 궁금합니다.

zeroth_lexicon은 기존 lexicon과 task domain LM 생성하면서 만들어진 _corpus_task_/lexicon을 합쳐서 사용하시면 됩니다.
zeroth_morfessor.seg는 따로 업데이트를 안하셨으면 그냥 그대로 사용해도 문제 없습니다.

>>> 2. 크롤링해서 구한 텍스트 파일의 크기가 59M 정도인데, 용량이 작아서 크게 변화가 없다고 한들
fg.arpa.gz 파일의 용량이 감소한 것은 이해가 가질 않습니다.

용량이 작아진 이유는 정확히 모르겠습니다...
아마 mix하면서 생기는 현상같은데...
중요한 건 성능이니 ppl이나 디코딩 결과를 보셔야 할 것 같습니다.

2021년 10월 18일 월요일 오후 8시 39분 52초 UTC+9에 AronGs님이 작성:

AronGs

unread,
Oct 19, 2021, 3:04:50 AM10/19/21
to zeroth-help
잘 알겠습니다!! 덕분에 정말 쉬운 길로 갈 수 있겠네요.

기초적인 질문들, 조금이라도 베이스가 있는 사람이라면 금방 알 수 있을 질문들에 
질리실 수도 있으셨을텐데 하나부터 열까지 매번 친절하게 도와주셔서 정말 감사합니다.

2021년 10월 19일 화요일 오후 1시 12분 9초 UTC+9에 이승현님이 작성:
Reply all
Reply to author
Forward
0 new messages