syllable, word, sub_word and phrase segmenter for Burmese (Myanmar language)
- Introduction
- Rule: Syllable Segmentation with Regular Expression
- Syllable Segmentation with "myWord" Segmentation Tool
- Theory: Word Segmentation with Viterbi Algorithm
- Building Unigram, Bigram Dictionaries for Word Unit
- Word Segmentation with "myWord" Segmentation Tool
- Theory: Unsupervised Phrase Segmentation with NPMI
- Phrase Segmentation with "myWord" Segmentation Tool
- Command-line Help
- Introduction to "npmi_train" Option
- Dictionaries for Word and Phrase Segmentation
- Files and Folder Information
- Evaluation of myWord for "Word Segmentation"
- Commands of myWord Segmentation Tool
- Contributors
- To Do
- License
- Citation
- Reference
ááźááşááŹá Ꮰá áŹááŻáśá¸áá˝áąááᯠááąáŤáˇááąáŤáˇááŤá¸ááŤá¸áá˛áˇ ááźááşááźááşáááşáááş ááźááşááąá¸áááŻááşááźáŽá¸á library áá˝áą áĄááťáŹá¸ááźáŽá¸áááŻáááşá¸ áážáŽáááąáᲠDeveloper áá˝áąá áá˝ááşáá˝ááşáá°áá° embedding ááŻááşáááŻááşááźáŽá¸ááąáŹáˇ áááŻááşáˇááąááŹáá˛áˇáááŻááşáááşá¸ extend ááŻááşáááŻááşáá˛áˇ word segmentation tool á ááŽááąáˇáĄáá ááážáááąá¸áá°á¸áááŻáˇ ááŹá¸áááşááŹá¸áááşá áĄá˛áᎠáá˝ááşáááşáááŻááźááşáˇáááŻááşáááŻáˇáááşáá˝ááşááźáŽá¸ááąáŹáˇ myWord ááᯠR&D ááŻááşáá˛áˇááźáŽá¸ release ááŻááşááąá¸áááŻááşááŤáááşá
myWord Segmentation Tool ááᯠááŻáśá¸ááźáŽá¸ááąáŹáˇ ááźááşááŹá áŹááźáąáŹááşá¸áá˝áąááᯠ"syllable unit", "sub_word", "word unit", "phrase unit" áá˝áą áĄááźá áş ááźááşááąá¸áá˛áˇ ááááŻááááşááŤá NLP preprocessing/post-editing áĄááŻááşáá˝áąá ááźááşááŹá áŹáá˛áˇ áááşáááşáá˛áˇ ááąááŹáá˝áąááᯠá áŹááŻáśá¸ááźááşááźáŽá¸ model ááąáŹááşáááŻáˇáĄáá˝ááş áĄááŻáśá¸áááşááŤááááşáˇáááşá
myWord Segmentation Tool á áĄááá ááŻááşááąá¸áááŻááşáá˛áˇ áĄááťááşáá˝áąáááŻááąáŹáˇ áĄááşášáááááşáááŻáᲠááťááąá¸ááąá¸áááŻááşáááşá
- Written with Python programming (so... you can hack easily)
- Used unigram, bigram dictionaries built with "manually segmented twelve million words" training corpus (myWord Corpus Ver. 1.0)
- Yes, myWord supports "syllable", "sub_word", "word" and "phrase" segmentation
- Of course, you can train or build unigram, bigram dictionaries with your segmented corpus
- By default, running word segmentation with Viterbi Algorithm
- By default, running phrase segmentation with NPMI (Normalized Pointwise Mutual Information) Algorithm
- Shared Burmese unigram, bigram dictionaries with MIT License
ááźááşááŹá áŹáĄáá˝ááş syllable segmentation á áĄááąá¸ááźáŽá¸áá˛áˇ word segmentation unit áá áşááŻááŤá áĄáá°á¸áááźááşáˇ ááąááŹá ááąáŹááşá¸ááąáŹááşá¸ááážáááŹááźáąáŹááşáˇááąáŹá ááźáááşáá˛áˇ word segmenter á ááážáááŹááźáąáŹááşáˇááąáŹ Machine Translation ááŻááąáááážáŹáááŻáááş syllable segmentation ááźááşááźáŽá¸ááąáŹáˇ ááŹááŹááźááşááŹá word segmentation ááŻááşááźáŽá¸ training ááŻááşááŹáááşááąáŹááş ááááşáá˝áąá áááŻááąáŹááşá¸áááŻááşááźáąáŹááşá¸ááᯠá áŹáááşá¸áá˝áąááąá¸ááźáŽá¸áááşá¸ áááşááąááźáá˛áˇááźáŽá¸ááŤááźáŽá myWord Segmentation Tool áážáŹáááşá¸ syllable breaking ááŻááşááąá¸áá˛áˇ option áááŻáááşáˇááŹá¸ááŤáááşá
Syllable breaking áááŻáááşá¸ Finite State Model ááąáŹááşááźáŽá¸ááźááşááŹááťááŻá¸á syllable list áĄááááŹááşááąáŹááşááźáŽá¸ ááźááşááŹááťááŻá¸ á
áááşááźááşáˇ approach áĄááťááŻá¸ááťááŻá¸áá˛áˇ áá˝áŹá¸áááŻáˇáááąáá˛áˇ 2014 ááąáŹááşáážáŹ propose ááŻááşáá˛áˇáá˛áˇ sylbreak (Link: https://github.com/ye-kyaw-thu/sylbreak) áá˛á Regular Expression (RE) áááŻáᲠááŻáśá¸ááŹá¸ááŤáááşá ááŹááźáąáŹááşáˇáá˛áááŻáááş Unicode áá˛áˇ á
áŹáááŻááşááŹá¸áá˛áˇ ááźááşááŹá
áŹáá˝áąáĄáá˝ááşá RE áá
áşááźáąáŹááşá¸áááşá¸áá˛áˇ áážáážáá áĄááŻááşááŻááş ááąá¸áááŻáˇááŤá ááźáŽá¸ááąáŹáˇ NLP áĄááŻááşáá˝áą áĄááťáŹá¸ááźáŽá¸áĄáá˝ááşáááşá¸ áááşáážá syllable breaking RE áááşáážááşááťááşáá˛áˇáááş áĄáááşááźáąáááŻáˇááŤá Python code áá˛áˇáᲠáĄáá˝ááşáážááşá¸ááźááááşááąáŹáˇ áĄáąáŹááşááŤáĄáááŻááşá¸ ááťááşá¸ (á-áĄ)á áĄááşášáááááşá
áŹááŻáśá¸áá˛áˇ áĄááşášáááááşááááşá¸ (a-z,A-Z,0-9)á áááźáŹá¸á
áŹááŻáśá¸ (áŁá¤áĽáŚáááŻáˇááᯠáááá˝áąá ááźááşááŹááááşá¸á áááşášááąááááťááŻáˇ)á ááŤááşáááˇáş áááşáˇáá˛áˇ Unicode áááşášááąá áá˛áˇ áĄáááşáĄáášááᏠá
áŻá
áŻááąáŤááşá¸ variable ááŤá¸ááŻááᯠáááşáážááşáááŻááşááźáŽá¸áááş ((?<!" + ssSymbol + r")["+ myConsonant + r"](?![" + aThat + ssSymbol + r"])" + r"|[" + enChar + otherChar + r"])
áááŻáá˛áˇ RE ááᯠpass ááŻááşááąá¸áááŻááşááŻáśááŤáá˛á áᎠRE á ááąá¸ááŹá¸áá˛áˇ Rule áááąáŹáˇ ááŤááşáááˇáş áááşáˇáá˛áˇ áááşášááąá ááąáŹááşá áááŻááşáá˛áˇ ááťááşá¸ áááŻááşáááşá ááźáŽá¸ááąáŹáˇ áĄáááşáá˛áˇáá˝á˛ááąáá˛áˇ ááťááşá¸ áááŻááşáááş áĄá˛ááŽááťááşá¸ á
áŹááŻáśá¸áá˛áˇ áážáąáˇáážáŹ break point ááŻááşááŤá áááŻáˇáááŻááş áĄááşášáááááşá
áŹááŻáśá¸áááŻáˇ otherChar áĄááąáá˛áˇ áááşáážááşááŹá¸áá˛áˇ á
áŹááŻáśá¸áá˝áą áááŻáááşáááşá¸ áĄá˛ááŽá
áŹááŻáśá¸áá˝áąáá˛áˇ áážáąáˇáážáŹ break áááşáˇááŤáááŻáˇ áááşáážááşááŹá¸áᏠááźá
áşááŤáááşá
myConsonant = r"á-áĄ"
enChar = r"a-zA-Z0-9"
otherChar = r"áŁá¤áĽáŚá§áŠáŞáżáááá-ááá!-/:-@[-`{-~\s"
ssSymbol = r'áš'
aThat = r'áş'
#Regular expression pattern for Myanmar syllable breaking
#*** a consonant not after a subscript symbol AND a consonant is not followed by a-That character or a subscript symbol
BreakPattern = re.compile(r"((?<!" + ssSymbol + r")["+ myConsonant + r"](?![" + aThat + ssSymbol + r"])" + r"|[" + enChar + otherChar + r"])", re.UNICODE)
input file á áĄáąáŹááşááŤáĄáááŻááşá¸áážááááşáááŻáˇ áááŻááźááŤá ááŻáˇ...
$ cat test.txt
ááťá˝ááşááąáŹáşáááŻááąáááááŹá¸ááŤá
ááąáˇááąáŹáááąáŹááźááşááŹá
áŹáá˛áˇáá˝ááşááťá°ááŹáá˛áˇáá˛áĄááŻááş ááťáŹá¸ á፠áááş
áááşá¸áááąáŹááŹáĄááŻááşááŻááşááŹáá˛á
ááźáąáŹááźááŤáĄáŻáśá¸
ááąáŹááŽáááşá¸áááşááąáŹááşááťááşáááşááźáąáŹáá˝áŹ
ááášáááąá¸áážáŹááąáŤáşáĄáąáŹááşáááşá¸á
áŻááźááşááááşáˇáá˝ááşá¸ááźáąáŹáááşáá˛áˇá
syllable segmentation ááŻááşáááŻáˇáĄáá˝ááşá command line argument ááᯠsyllable áááŻáˇ ááąá¸ááźáŽá¸ááąáŹááş <input-file> áá˛áˇ <output-file> áá˝áąáá˛áˇ ááŹáááşáá˝áąááᯠáááŻááşáááşáˇááąá¸áááŻááşááŻáśááŤáá˛á
$ python ./myword.py syllable ./test.txt ./test.syllable
$ cat ./test.syllable
ááťá˝ááş ááąáŹáş á áᯠááą á á á ááŹá¸ á፠á
ááąáˇ ááąáŹ á ááąáŹ ááźááş áᏠá
Ꮰáá˛áˇ áá˝ááş ááťá° áᏠáá˛áˇ áᲠᥠááŻááş ááťáŹá¸ á፠áááş
áááşá¸ á ááąáŹ áᏠᥠááŻááş ááŻááş áᏠáᲠá
ááźáąáŹ ááź á፠áĄáŻáśá¸
ááąáŹ áᎠáááşá¸ áááş ááąáŹááş ááťááş áááş ááźáąáŹ áá˝áŹ
ááášá ááąá¸ áážáŹ ááąáŤáş áĄáąáŹááş áááşá¸ á
ᯠááźááş ááááşáˇ áá˝ááşá¸ ááźáąáŹ áááş áá˛áˇ á
áááşáážá ááŹá¸áážááşá¸ myWord áá˛áˇ word segmentation ááŻááşááŻáśáááąáŹáˇ áááşáá˛áˇ á áŹááŻáśá¸áá áşááŻáśá¸ááťááşá¸á ᎠááąááąááťáŹááťáŹ ááźááşááŹá¸áá˛áˇ á áŹááźáąáŹááşá¸ááą á ááááşá¸ááťáąáŹáşá á áŹááŻáśá¸ááą áááááşá¸ááťáąáŹáşáážááá˛áˇ training corpus áááą áááááŻáśá¸ ngram áĄááááŹááşáážá áşáᯠ(unigram, bigram) ááᯠááźááŻáááşáááşááąáŹááşááŹá¸ááźáŽá¸ááąáŹáˇ Viterbi algorithm áá˛áˇ decoding ááŻááşáá˛áˇ approach ááᯠáĄááŻáśá¸ááźáŻááŹá¸ááŤáááşá áááşá¸áááşá¸ áĄááąá¸á áááş ááźááşáˇááźáąáŹááááş input áááşááŹáá˛áˇ á áŹááźáąáŹááşá¸áá˛áˇ character áá áşááŻáśá¸ááťááşá¸á áŽááᯠbigram, unigram ááąáŹáşáááşáážá áşááŻáá˛áˇ score ááŻááşáá˝áŹá¸ááźáŽá¸ááąáŹáˇá áĄááźá áşáááŻááşááŻáśá¸ á áŹááŻáśá¸áá˝á˛ ááᯠViterbi algorithm áááŻááŻáśá¸ááźáŽá¸ááąáŹáˇ áá˝áąá¸áá˛áˇ áááşá¸áááşá¸ááŤá Score ááŻááşáá˛áˇáĄááŤáážáŹ áĄáááşááŻáśá¸ bigram áĄááááŹááşáážáŹ áážááááş áĄá˛áᎠProbability ááᯠáá°ááźáŽá¸ááąáŹáˇá bigram áĄááááŹááşáážáŹ áĄá˛áᎠá áŹááŻáśá¸áá˝á˛á áážáŹááá˝áąáˇáááşááąáŹáˇ unigram áĄááááŹááşá probability ááᯠáá°ááŤáááşá
Viterbi Algorithm á 1967 áážáŹ Andrew J. Viterbi áááŻáá˛áˇ áĄááşááťááşááŽááŹá propose ááŻááşáá˛áˇáá˛áˇ algorithm ááŤá áᎠalgorithm á Dynamic Programming Algorithm áĄáŻááşá
áŻáá˛áážáŹ ááŤááźáŽá¸ááąáŹáˇ Automatic Speech Recognition (ASR), Data recording, Part-Of-Speech (POS) tagging, DNA sequencing, Space Communication á
áááşááźááşáˇ á§ááááŹááťááŻá¸á
áŻáśáážáŹ áĄááŻáśá¸ááźáŻááąááźááŤáááşá ááťá˝ááşááąáŹáşáááŻáˇ ááąáˇá
ááş áĄááŻáśá¸ááźáŻááąáá˛áˇ áááŻáááŻááşá¸ááŻááşá¸áááşáá˝ááşáážáŻáá˝áąáážáŹáááşá¸ Viterbi algorithm ááᯠááŻáśá¸ááŹá¸ááŤáááşá áĄá˛ááŤááźáąáŹááşáˇ áá˝ááşáá˛áˇáá˛áˇ áážá
áşááąáŤááşá¸ á
á áĄáá˝ááşá¸áážáŹ ááááşááᯠááŹáááşááźáŽá¸áá˛áˇ algorithm áá
áşááŻááźá
áşááźáŽá¸ áááşáá˝áąáˇ ááááŹá¸áááşáááşá¸ áááŻááşáˇáĄááŻááşáá˝áąáĄáá˝ááş áĄááŻáśá¸áááşááŹáááŻáˇ áá˝ááşááťá°ááŹáááŹá¸áá˝áąá áĄááşááťááşááŽááŹáá˝áąáĄááąáá˛áˇá ááááááźá
áşáááŻáˇááᯠááźáąáŹáááŤááááşáˇáááşá ááááşáááşá¸ áĄááąá¸á
áááş ááąáˇááŹááťááşáá˛áˇ áá°áá˝áąá áá°áá˛áˇ áááşá
ááşááąáá˛áˇ Markov Process, Markov Property, Markov Chain, Hidden Markov Model (HMM) áááŻáˇááᯠáĄáááşááąáˇááŹááŤáááŻáˇ áĄááźáśááąá¸ááťááşááŤáááşá áĽááᏠáá
áşááŻáĄááąáá˛áˇ Viterbi áá˛áˇ áĄááŻááşááŻááşááŻáśááᯠááźáąáŹááááş... áááŻááźááŤá
ááŻáˇ ááťá˝ááşááąáŹáşáááŻáˇáážáŹ HMM POS tagging ááŻááşááąá¸áá˛áˇ HMM ááąáŹáşáááşá ááąáŹááşááŹá¸ááźáŽá¸ááŹá¸áááŻáááş á
áŹááźáąáŹááşá¸ áĄáá
áşáá
áşááźáąáŹááşá¸ááᯠáĄá˛áᎠHMM ááąáŹáşáááşááᯠpass ááŻááşááźáŽá¸ááąáŹáˇ POS tagging ááŻááşáááŻááşá¸áá˛áˇáĄááŤáážáŹ á
áŹááźáąáŹááşá¸ áá˛áážáŹ ááŤáá˛áˇ á
áŹááŻáśá¸ áĄááąáĄáá˝ááşááąáŤáşááᯠáá°áááşááźáŽá¸ááąáŹáˇ ááźá
áşáááŻááşááťáąáážááá˛áˇ tag sequence áá˝áąá áĄááťáŹá¸ááźáŽá¸áááŻáˇáááŻáˇ áĄááźá
áşáááŻááşááŻáśá¸ááąáŹ POS tag sequence ááᯠááąáŹáşáááşá predict ááŻááşáá˛áˇ áĄááŤááťááŻá¸áážáŹ Viterbi ááᯠááŻáśá¸ááźáŽá¸ best path ááᯠáážáŹáááŻáˇ áááŤáááşá áĄá˛ááŽááᯠáááŻááşáᲠbrute force searching áá˛áˇ áážááááťáž path áĄááŻááşáááŻáá˝ááşááźáŽá¸áážáᏠáá˝áąá¸áááşáááŻááźáŽá¸ á
ááşá¸á
áŹá¸áááş áá˝ááşááťá°áᏠmemory á ááááŻááşááŤáá°á¸á ááŹááźáąáŹááşáˇáá˛áááŻááąáŹáˇ ngram áĄááááŹááşáĄááźááşá HMM áážáŹá Observed state áá˛áˇ Hidden state áááŻááźáŽá¸ áážá
áşáááŻááşá¸ááŤááŹááźáąáŹááşáˇ ááťá˝ááşááąáŹáşáááŻáˇá transition probability (POS-tag áá
áşááŻáá˛áˇ áá
áşááŻáĄááźáŹá¸) ááąáŹ emmission probability (POS-tag áá˛áˇ word áĄááźáŹá¸) ááąáŹ ááᯠáá˝ááşááźááážáŹáááŻáˇ á
áŹááŻáśá¸áĄááąáĄáá˝ááşá ááťáŹá¸ááŹááŹáá˛áˇ áĄááťáž operation á exponentially áááŻá¸ááŹáážáŹáááŻáˇááŤá áá˝ááşááťá°ááŹáááŹá¸áá˝áą áĄááťáŹá¸á
ᯠááááŹá¸ááźáá˛áˇ Computational Complexity áĄááąáá˛áˇ ááźááşáˇáááşáááŻáááş Brute Force algorithm á O(S^T)
ááźá
áşááźáŽá¸ááąáŹáˇ Viterbi algorithm á O(T*S^2)
áááŻáˇ ááąáŹáşááźáááŻáˇ áááŤáááşá ááŽááąááŹáážáŹ ááźáąáŹááąáá˛áˇ "S" á HMM network áá˛áážáŹ áážáááąáá˛áˇ state áĄááąáĄáá˝ááş (i.e. the number of states) ááᯠáááŻááşá
áŹá¸ááźáŻááźáŽá¸ááąáŹáˇá "T" áááąáŹáˇ á
áŹááźáąáŹááşá¸ áá
áşááźáąáŹááşá¸áážáŹ áážááá˛áˇ á
áŹááŻáśá¸áĄááąáĄáá˝ááş (i.e. the length of the data sequence) ááᯠáááŻááşá
áŹá¸ááźáŻááŹááźáąáŹááşáˇ Viterbi Algorithm á computational cost ááᯠáĄááťáŹá¸ááźáŽá¸ ááťáąáŹáˇáá˝áŹá¸á
áąááŤáááşá
Word segmentation áĄááŻááşáááŻáááşá¸ graph áĄááąáá˛áˇ ááźááşááźááşáˇááźáŽá¸ á ááşá¸á áŹá¸ááźááşáˇááźááĄáąáŹááşá áážááşá¸ááźááᏠáá˝ááşáá°áĄáąáŹááşáááŻáˇ input á áŹááźáąáŹááşá¸ááᯠááźááşááŹá áŹááŻáśá¸ "áááŹá" áááŻáá˛áˇ á áŹááŻáśá¸ áážá áşááŻáśá¸ááŤáá˛áˇ á ááŹá¸á áŻááąá¸áááŻáᲠáĽáááŹááŻáśá¸ááźáŽá¸ááąáŹáˇ áážááşá¸ááźááŤáááşá áááşááŹáá˛áˇ á áŹááźáąáŹááşá¸ááᯠcharacter áá áşááŻáśá¸ááťááşá¸á ᎠááźááşááźáŽá¸ááąáŹáˇ node áá áşááŻááťááşá¸á áŽáĄáá˝ááş probability áá˝áąááᯠáá˝ááşááźáŽá¸ break point ááᯠá ááşá¸á áŹá¸áá˛áˇ ááąááŹáážáŹ Brute force áá˛áˇááŹáááŻáááş node áĄááŻááşááᯠáá˝ááşááźáŽá¸ááž final word boundary ááᯠááŻáśá¸ááźááşáááŻááşáážáŹ ááźá áşááŤáááşá áááŻáˇááąáŹáş Viterbi algorithm áá˛áˇ áĄááŻááşááŻááşááŻáśáááąáŹáˇ memory áážáŹ áážáąáˇá áá˝ááşáá˛áˇáá˛áˇ node áá áşááŻááťááşá¸á áŽáĄáá probability distribution ááᯠáážááşááŹá¸ááŹá¸ááźáŽá¸ááąáŹáˇ áááşá¸ááááş node áááąááŹááŹáážáŹ áááşáážá áĄááťáááşáĄáá áá˝ááşáá˛áˇáá˛áˇ ááááşáá˝áąáá˛áááą ááááŻáĄááşááąáŹáˇáá˛áˇ path áá˝áąááᯠááźáŻááşááťááŹá¸áá˛áˇááźáŽá¸ ááźá áşáááŻááşááťáąáĄáážáááŻáśá¸ best path áááŻáᲠáááşáˇáááşáˇááźáŽá¸ áĽáŽá¸áááşáá˝ááşáá˝áŹá¸áá˛áˇ ááŻáśá áśááŤá Algorithm áĄááąáá˛áˇ áĄááŻááşááŻááşááŻáśááᯠááááááťááť ááźáąáŹááááşááąáŹáˇ forward order áá˛áˇ backward order áááŻááźáŽá¸ááąáŹáˇ áážá áşáááŻááşá¸ááŤáááşááźáŽá¸á forward áážáŹá node áá áşááŻááťááşá¸á áŽááᯠááąáŹááşáááŻáˇáĄáá˝ááş ááŹáá˛áˇ best path áá˝áąááᯠáá˝ááşáá˝áŹá¸ááŤáááşá Backward order áĄáááŻááşá¸áááąáŹáˇ á áŹááźáąáŹááşá¸ áĄá áááą áĄááŻáśá¸áĄáá best path ááᯠááąáŹááşáá˝áŹá¸áá˛áˇ ááŻáśá áśááŤá Backward operation áá˛áˇ calculation ááŻááşáá˛áˇááŻáśá áśáááąáŹáˇ á áŹááźáąáŹááşá¸áĄááŻáśá¸áááą á áŹááźáąáŹááşá¸áážáąáˇááŻáśá¸ááᯠááźáąáŹááşá¸ááźááş ááźááşáá˝áŹá¸áá˛áˇ ááŻáśá áśáá˛áˇáá˝ááşááŤáááşá áĄá˛ááŤááźáąáŹááşáˇáááŻáˇáááŻáˇáááşá¸ Backward áááŻáˇááŻáśá¸ááŹááŤá
áááááŻáśá¸ ááąáˇááŹáá˛áˇáá°áá˝áąáĄáá˝ááşá follow áááŻááşáááŻáˇ áááşáááŻááşááŹááźáąáŹááşáˇ "áááŹá" áááŻáá˛áˇ á áŹááźáąáŹááşá¸áááŻáˇááąá¸áááŻáᲠgraph áĄááąáá˛áˇ ááźááşááźáŽá¸ best path ááᯠáááşááᯠáá˝ááşááᲠáááŻááŹááᯠáĄááŻááşááŽááŹááá˝áŹá¸áááŻáˇ á ááşá¸á áŹá¸ááźááşáˇááźááĄáąáŹááşá Fig.1 áááŻáááşááźáŽá¸ááąáŹáˇ áážááşá¸áá˝áŹá¸ááŤáááşá ááŻáśáážáŹ ááźááŹá¸ááááŻááŤáᲠgraph áážáŹá node áá˝áąáážááááşá áĄá˛áᎠnode áá˝áąááᯠáááşááąáá˛áˇ path áá˝áąáááşá¸ áážáááŤááááşáˇáááşá node áá áşááŻááťááşá¸á áŽá character áá áşááŻáśá¸ááťááşá¸á áŽááᯠáááŻááşá áŹá¸ááźáŻááźáŽá¸ááąáŹáˇ path áá áşááŻááťááşá¸á áŽá input á áŹááźáąáŹááşá¸ááᯠáááşááᯠááŻáśá áśááťááŻá¸áá˛áˇ segmentation ááŻááşáá˝áŹá¸áááşáááŻáá˛áˇ áááşá¸ááźáąáŹááşá¸áá˝áą ááźá áşááŤáááşá Path áá áşááŻá áŽáážáŹ ááźááşáá˝áŹá¸áááşáˇá áŹááŻáśá¸áá˛áˇáĄáá° áá˝á˛ááąá¸ááŹá¸áá˛áˇ ááááşá¸áá˝áąá path weight áá˝áąááźá áşááźáŽá¸á áááşáážá á áŹááŻáśá¸ááźááşáááŻáˇááŻááşááąáá˛áˇ á áŹááźáąáŹááşá¸áá˛áˇ unigram negative log property áá˝áą áááŻáˇáá°áááąá¸ááŤá
ááááŻááááşáĄááąáá˛áˇá áĄááŻááşááŻááşáá˛áˇáĄááŤáážáŹ character ááąá¸ááŻáśá¸ááźá áşáá˛áˇ "á" "á" "áŹ" áá˛áˇ "á" ááᯠáá˝á˛áááŻáˇ ááá˛áˇ sequence pattern áĄááŻááşááŻáśá¸ááᯠá ááşá¸á áŹá¸áááŹáááŻáˇ ááááşá áĄáąáŹááşá፠path áá˝áąááᯠáááşáˇáá˝ááşá¸á ááşá¸á áŹá¸áááŤáááşá
- Path1: 0--->1--->2--->3--->4 = 2.0 + 2.5 + 4.1 + 1.0 = 9.6 = á | á | Ꮰ| á
- Path2: 0--->2--->3--->4 = 3.3 + 4.1 + 1.0 = 8.4 = áá | Ꮰ| á
- Path3: 0--->3--->4 = 1.2 + 1.0 = 2.2 = ááᏠ| á
- Path4: 0--->4 = 2.8 = áááŹá
- Path5: 0--->2--->4 = 3.3 + 3.8 = 7.1 = áá | áŹá
- Path6: 0--->1--->4 = 2.0 + 3.9 = 5.9 = á | ááŹá
- Path7: 0--->1--->3--->4 = 2.0 + 2.6 + 1.0 = 5.6 = á | áᏠ| á
áĄáááşáážáŹ ááźááŹá¸áá˛áˇ path áá˝áąáá˛áááž Viterbi algorithm á best path áááŻáˇáááŻááş shortest path áááŻáá˝áąá¸áážáŹ ááźá
áşááŤáááşá áĄá˛ááŤááźáąáŹááşáˇ Path3: 0--->3--->4 = 1.2 + 1.0 = 2.2
á path áá˝áąáĄáŹá¸ááŻáśá¸áá˛áážáŹ áááşáááŻá¸áĄááááşáˇááŻáśá¸áááŻáˇáááŻáˇ semented output áĄááąáá˛áˇá "ááᏠ| á" áááŻááźáŽá¸ááąáŹáˇ áážááşáážááşáááşáááş word segmentation ááŻááşááąá¸áážáŹ ááźá
áşááŤáááşá ááááşáááşá¸áá˝ááşáá˛áˇáĄááŤáážáŹ á
áŹááŻáśá¸ áá
áşááŻáśá¸ááťááşá¸á
áŽáá˛áˇ probability á unigram áĄááááŹááşá ááŹááŹááźá
áşááźáŽá¸ááąáŹáˇ negative log probability ááᯠááŻáśá¸ááŹááźáąáŹááşáˇ áĄáąáŹááşá፠ááŻáśá
áśááťááŻá¸áá˝ááşáᏠááźá
áşááŤáááşá Shortest path ááᯠáá˝áąá¸áá˛áˇ áĄááŻááşááᯠBackward operation áážáŹ ááŻááşáá˝áŹá¸áᏠááźá
áşááŤáááşá
-log(P( ááᏠ)) + -log(P( á )) = 1.2 + 1.0 = 2.2
áĄáááşá Fig.1 áážáŹ ááźáá˛áˇáá˛áˇ "áááŹá" áááŻáá˛áˇ input á áŹááźáąáŹááşá¸áĄáá˝ááş á áŹááŻáśá¸ ááźááşáááŻáˇááá˛áˇ áááşá¸ááźáąáŹááşá¸áá˝áą áĄááťááŻá¸ááťááŻá¸áážááá˛áˇáĄáá˛áááą shortest path ááᯠgraph áĄááąáá˛áˇ áá˝á˛ááźááááşááąáŹáˇ áĄáąáŹááşááŤááᯠááŻáśááťááŻá¸ (Fig. 2) ááᯠáá˝á˛áááŻáˇ áááŤááááşáˇáááşá
ááááşáˇ áááşáá˝áąáˇáážáŹá áááŹáá˛áˇ á áá˛áˇ ááźááşááŹá áŹááŻáśá¸áá˝áąá corpus áá˛áážáŹ áĄááťáŹá¸ááźáŽá¸áážááážáŹáááŻáˇ ááąááŹááťáŹá¸ááťáŹá¸áá˛áˇ ngram áĄááááŹááşááᯠááąáŹááşááŹá¸áááş ááąáŹááşááŹá¸áááᯠá áŹááźáąáŹááşá¸ áážááşáááş áážááşáááᯠword boundary ááᯠáááşáˇáážááşá¸áááŻáˇáĄáá˝ááşá áá˝ááşááťá°ááŹá áá˝ááşááááşáˇ path áá˝áąá áááşá¸áá˛áˇááťáŽááźáŽá¸ áážááá˝áŹá¸áááŻááşááŤáááşá áĄá˛ááŤááźáąáŹááşáˇ HMM áááŻááąáŹáşáááşáá˝áąáá˛áˇ decoding áážáŹ Viterbi algorithm ááᯠááŻáśá¸ááźááŹááźá áşááŤáááşá
ááźááşááŹá
áŹáĄáá˝ááş Word Segmentation tool ááᯠimplementation ááŻááşáááŻáˇ á
ááşá¸á
áŹá¸áá˛áˇáĄááŤáážáŹáááşá¸ ááąááŹáᏠáážááááşáááŻáááş áá˝ááşáá˝ááşáá°áá°áá˛áˇ training ááŻááşááźáŽá¸ áááŻá¸áážááşá¸ááźáŽá¸ powerful ááźá
áşáá˛áˇ algorithm áá˛áˇ á
áŹááŻáśá¸áá˝áąááᯠááźááşááąá¸áááŻáˇ á
ááşá¸á
áŹá¸áá˛áˇáĄááŤáážáŹ Viterbi algorithm áááŻáᲠááŻáśá¸áááŻáˇ ááŻáśá¸ááźááşáá˛áˇááŤáááşá áážáąáˇá áááŹáá˝áąááźá
áşáá˛áˇ Dr. Peter Norvig (áĄááąáááááş áá˝ááşááťá°ááŹáááášááśáááŹáážááş, Google LLC áá˛áˇ ááŤáááŻááşááŹ) á ááąá¸ááŹá¸ááŹá¸áá˛áˇ Beautiful Data á
áŹáĄáŻááşáá˛áˇ Chapter 14: Natural Language Corpus Data áá˛áˇ áĄáááşá¸áážáŹááŻáśá¸ááŹá¸áá˛áˇ ngram áĄááááŹááşááąáŹááşááźáŽá¸ááąáŹáˇ Viterbi table ááąáŹááşááźáŽá¸ á
áŹááŻáśá¸ááźááşááźááŹá¸ááŹááᯠáážáŽááźááşá¸ááŹá¸ááŤáááşá Coding ááááşá¸ updated version code, Mark Dong ááᯠáážáŽááźááşá¸ááŹá¸ááŤáááşá áááŻááşáˇ corpus áá˛áˇ ngram áĄááááŹááşááᯠááąáŹááşáááŻááşáĄáąáŹááş ááąá¸áá˛áˇáĄáááŻááşá¸áá˛áˇ plain text áááŻááş ngram áĄááááŹááşáá˝áąáĄá
áŹá¸ binary áĄááááŹááşáá˝áąááᯠááŻáśá¸áá˛áˇ áĄáááŻááşá¸áá˝áąááᯠááźááşáˇá
á˝ááş coding ááŻááşáá˛áˇááŤáááşá Recursion limit áááŻáááşá¸ sys.setrecursionlimit(10**6)
áááŻááźáŽá¸ áááşáˇáá˛áˇááŤáááşá myWord Segmentation tool áážáŹ ááąá¸ááŹá¸áá˛áˇ viterbi function á áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá coding áááşáááŻááşáá˛áˇáá°áá˝áąá coding áááŻáááşáááşá¸ Vitabi algorithm áá˛áˇ word segmentation ááᯠáááşááᯠááŻááşáá˝áŹá¸áááşáááŻááŹááᯠááąáˇááŹááŹá áááŻááźááşááťááşáááşá¸ ááźááşáááŻááşááŤáááşá
@functools.lru_cache(maxsize=2**10)
#maxlen=20
def viterbi(text, prev='<S>', maxlen=20):
if not text:
return 0.0, []
print("text: ", text)
textlen = min(len(text), maxlen)
splits = [(text[:i + 1], text[i + 1:]) for i in range(textlen)]
candidates = []
for first_word, remain_word in splits:
#pdb.set_trace()
first_prob = math.log10(conditionalProb(first_word, prev))
print("first_prob of condProb(", first_word, ", ", prev, "): ", first_prob )
remain_prob, remain_word = viterbi(remain_word, first_word)
print("remain_prob: ", remain_prob, ", remain_word: ", remain_word)
candidates.append((first_prob + remain_prob, [first_word] + remain_word))
#print("first_prob: ", str(first_prob), ", remain_prob: ", remain_prob, ", [first_word]:", [first_word], ", remain_word: ", remain_word)
print("Candidates: ", candidates)
print("max(candidates): " + str(max(candidates)))
print("====================")
return max(candidates)
áĄááŻááşááŻááşááŻáśááᯠtrace ááŻááşááᏠáá˝ááşáĄáąáŹááşáááŻáˇ print statement áá˝áąáááŻá፠áááşááźááşáˇááźáŽá¸ viterbi function ááᯠ"áááŹá" áááŻáá˛áˇ á áŹááźáąáŹááşá¸áá áşááźáąáŹááşá¸áááşá¸áááŻáᲠáááşáˇááźáŽá¸ run ááąá¸ááŹá¸ááŤáááşá áá˝ááşááťá°áᏠterminal screen áážáŹ áááŻááşááŻááşááąá¸ááŹáá˛áˇ á áŹááźáąáŹááşá¸áá˝áąáááąáŹáˇ áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá áᎠfunction á recursive function áĄááąáá˛áˇ ááąáŤáşááŻáśá¸ááŹá¸ááŹáááŻáááşá¸ áááŻááźáŻááŤá
$ python ./myword.py word ./one_line.txt ./one_line.word
text: áááŹá
first_prob of condProb( á , <S> ): -2.3682169728893223
text: ááŹá
first_prob of condProb( á , á ): 0.15368326096895993
text: áŹá
first_prob of condProb( Ꮰ, á ): -4.1075915061395
text: á
first_prob of condProb( á , Ꮰ): 0.39394528587814026
remain_prob: 0.0 , remain_word: []
Candidates: [(0.39394528587814026, ['á'])]
max(candidates): (0.39394528587814026, ['á'])
====================
remain_prob: 0.39394528587814026 , remain_word: ['á']
Candidates: [(-3.71364622026136, ['áŹ', 'á'])]
first_prob of condProb( áŹá , á ): -6.010681493131443
remain_prob: 0.0 , remain_word: []
Candidates: [(-3.71364622026136, ['áŹ', 'á']), (-6.010681493131443, ['áŹá'])]
max(candidates): (-3.71364622026136, ['áŹ', 'á'])
====================
remain_prob: -3.71364622026136 , remain_word: ['áŹ', 'á']
Candidates: [(-3.5599629592924003, ['á', 'áŹ', 'á'])]
first_prob of condProb( áᏠ, á ): -0.7926188753050689
text: á
first_prob of condProb( á , áᏠ): 0.39394528587814026
remain_prob: 0.0 , remain_word: []
Candidates: [(0.39394528587814026, ['á'])]
max(candidates): (0.39394528587814026, ['á'])
====================
remain_prob: 0.39394528587814026 , remain_word: ['á']
Candidates: [(-3.5599629592924003, ['á', 'áŹ', 'á']), (-0.39867358942692865, ['ááŹ', 'á'])]
first_prob of condProb( ááŹá , á ): -7.010681493131443
remain_prob: 0.0 , remain_word: []
Candidates: [(-3.5599629592924003, ['á', 'áŹ', 'á']), (-0.39867358942692865, ['ááŹ', 'á']), (-7.010681493131443, ['ááŹá'])]
max(candidates): (-0.39867358942692865, ['ááŹ', 'á'])
====================
remain_prob: -0.39867358942692865 , remain_word: ['ááŹ', 'á']
Candidates: [(-2.766890562316251, ['á', 'ááŹ', 'á'])]
first_prob of condProb( áá , <S> ): -6.010681493131443
text: áŹá
first_prob of condProb( Ꮰ, áá ): -4.1075915061395
remain_prob: 0.39394528587814026 , remain_word: ['á']
Candidates: [(-3.71364622026136, ['áŹ', 'á'])]
first_prob of condProb( áŹá , áá ): -6.010681493131443
remain_prob: 0.0 , remain_word: []
Candidates: [(-3.71364622026136, ['áŹ', 'á']), (-6.010681493131443, ['áŹá'])]
max(candidates): (-3.71364622026136, ['áŹ', 'á'])
====================
remain_prob: -3.71364622026136 , remain_word: ['áŹ', 'á']
Candidates: [(-2.766890562316251, ['á', 'ááŹ', 'á']), (-9.724327713392803, ['áá', 'áŹ', 'á'])]
first_prob of condProb( ááᏠ, <S> ): -1.2541214501247606
text: á
first_prob of condProb( á , ááᏠ): 0.39394528587814026
remain_prob: 0.0 , remain_word: []
Candidates: [(0.39394528587814026, ['á'])]
max(candidates): (0.39394528587814026, ['á'])
====================
remain_prob: 0.39394528587814026 , remain_word: ['á']
Candidates: [(-2.766890562316251, ['á', 'ááŹ', 'á']), (-9.724327713392803, ['áá', 'áŹ', 'á']), (-0.8601761642466204, ['áááŹ', 'á'])]
first_prob of condProb( áááŹá , <S> ): -4.709651497467462
remain_prob: 0.0 , remain_word: []
Candidates: [(-2.766890562316251, ['á', 'ááŹ', 'á']), (-9.724327713392803, ['áá', 'áŹ', 'á']), (-0.8601761642466204, ['áááŹ', 'á']), (-4.709651497467462, ['áááŹá'])]
max(candidates): (-0.8601761642466204, ['áááŹ', 'á'])
====================
áááŻááşáˇáážáŹ manual word segmentation ááŻááşááŹá¸ááźáŽá¸ááŹá¸ corpus á áĄáááşáˇáááşáˇáážááááşáááŻáááş myword áá˛áˇ n-gram dictionary ááąáŹááşáááŻáˇáĄáá˝ááşá áĄáąáŹááşááŤáĄáááŻááşá¸ command ááąá¸ááŤá
ááŽááąááŹáážáŹ myword á unigram, bigram áĄááááŹááşáá˝áąááᯠtext file format áĄááąáá˛áˇááąáŹ binary file format áĄááąáá˛áˇááąáŹ ááąáŹááşááąá¸áá˝áŹá¸áážáŹáááŻáˇ áĄá˛áᎠoutput filename áá˝áąááᯠ--unigram_word_txt unigram-word.txt
, --bigram_word_txt bigram-word.txt
, --unigram_word_bin unigram-word.bin
, --bigram_word_bin bigram-word.bin
áááŻááźáŽá¸ áááŻááşááąá¸ááťááşáá˛áˇ áááŻááşááŹáááşáá˝áąááᯠassign ááŻááşáá˝áŹá¸áááŻáˇ áááŤáááşá
Word n-gram dictionary building with full dictionary filenames parameters:
$ python ./myword.py build_dict --unigram_word_txt unigram-word.txt --bigram_word_txt bigram-word.txt --unigram_word_bin unigram-word.bin --bigram_word_bin bigram-word.bin ./corpus2.1k
ááááşáááŻáˇ default ngram dictionary ááŹáááşáá˝áąáá˛áˇáᲠááąáŹááşáá˝áŹá¸áááşá áááŻááşááŹáááşáá˝áąááᯠááŽá¸áááşáˇ assign ááŻááşááŹááťááŻá¸ áááŻááşáá°á¸ áááŻáááşááąáŹáˇ áĄáąáŹááşááŤáĄáááŻááşá¸ command áĄáááŻáá˛áˇáᲠngram áĄááááŹááşáá˝áąááᯠááąáŹááşáá˝áŹá¸áááŻáˇ áááŤáááşá
Word n-gram dictionary building with default filenames:
$ python ./myword.py build_dict ./corpus2.1k
myword áá˛áˇ word segmentation ááŻááşááŹááᯠdefault n-gram dictionary áá˝áąáááŻáᲠááŻáśá¸ááźáŽá¸ á
áŹááŻáśá¸ááźááşáááşáááŻáááşááąáŹáˇ áĄáąáŹááşááŤáĄáááŻááşá¸ command ááąá¸áááŤáááşá
ááŽááąááŹáážáŹ ./test.txt áááŻááşá input file ááźá
áşááźáŽá¸ááąáŹáˇ ./test.word áááąáŹáˇ á
áŹááŻáśá¸ááźááşááźáŽá¸ áá˝ááşááŹáá˛áˇ áááŻááşáááŻááááşá¸á
áąááťááşáá˛áˇ ááŹáááşááŤá
Word segmentation with default n-gram dictionaries:
$ python ./myword.py word ./test.txt ./test.word
input áááŻááşá áĄáąáŹááşááŤáĄáááŻááşá¸ ááŻáśá¸ááŹá¸ááŤáááşá
(space áá˝áąááŤááąáááşá¸ myword á auto remove ááŻááşááąá¸áá˝áŹá¸áážáŹáááŻáˇ ááá°á¸áá space áá˝áąááᯠááźáŻááşááźáŽá¸ááž input ááŻááşá
ááŹááááŻááŤáá°á¸á ááŻá áĽáááŹáĄááąáá˛áˇ ááźááşááŹáĄáąáŹááşáᏠááźááŹá¸ááŹááŤ)
$ cat test.txt
ááťá˝ááşááąáŹáşáááŻááąáááááŹá¸ááŤá
ááąáˇááąáŹáááąáŹááźááşááŹá
áŹáá˛áˇáá˝ááşááťá°ááŹáá˛áˇáá˛áĄááŻááş ááťáŹá¸ á፠áááş
áááşá¸áááąáŹááŹáĄááŻááşááŻááşááŹáá˛á
ááźáąáŹááźááŤáĄáŻáśá¸
ááąáŹááŽáááşá¸áááşááąáŹááşááťááşáááşááźáąáŹáá˝áŹ
ááášáááąá¸áážáŹááąáŤáşáĄáąáŹááşáááşá¸á
áŻááźááşááááşáˇáá˝ááşá¸ááźáąáŹáááşáá˛áˇá
word segmented ááŻááşááźáŽá¸ áá˝ááşááŹáá˛áˇ output áááŻááşá áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
$ cat test.word
ááťá˝ááşááąáŹáş á ááŻááąáá áááŹá¸ á፠á
ááąáˇ ááąáŹ á ááąáŹ ááźááşáᏠá
Ꮰáá˛áˇ áá˝ááşááťá°áᏠáá˛áˇ áᲠáĄááŻááş ááťáŹá¸ á፠áááş
áááşá¸ á ááąáŹ áᏠáĄááŻááş ááŻááş áᏠáᲠá
ááźáąáŹ ááź á፠áĄáŻáśá¸
ááąáŹáᎠáááşá¸ áááş ááąáŹááş ááťááş áááş ááźáąáŹ áá˝áŹ
ááášáááąá¸ áážáŹ ááąáŤáşáĄáąáŹááşáááşá¸á
áŻááźááş ááááşáˇáá˝ááşá¸ ááźáąáŹ áááş áá˛áˇ á
word segmentation ááŻááşáá˛áˇ áĄááŤáážáŹ unigram, bigram áĄááááŹááşáá˝áąááᯠassign ááŻááşááźáŽá¸ ááźááşáááşáááŻáááşááąáŹáˇ áĄáąáŹááşááŤáĄáááŻááşá¸ command ááąá¸ááźáŽá¸ run ááŤá
(Word segmentation with unigram, binary n-gram dictionaries)
$ python ./myword.py word --unigram_word_bin ./unigram-word.bin --bigram_word_bin ./bigram-word.bin ./test.txt ./test.word
Word Segmentation ááźááşáá˛áˇáĄááŤáážáŹ default á space áá˛áˇááźáŹá¸ááąá¸áážáŹ ááźá áşááąáá˛áˇ delimiter áááŻáááşá¸ áĄááťááŻá¸ááťááŻá¸ ááźáąáŹááşá¸áááŻáˇ áááŤáááşá áĽááᏠdelimiter ááᯠpipe áĄááźá áşááŹá¸ááźáŽá¸ word segmentation ááŻááşááťááşáááş áááŻáááşááąáŹáˇ áĄáąáŹááşááŤáĄáááŻááşá¸ command ááąá¸ run ááŤá
(Word segmentation with delimiter "pipe")
$ python ./myword.py word --delimiter "|" ./test.txt ./test.word
áá˝ááşááŹáá˛áˇ segmented output áááŻááşá áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
ááťá˝ááşááąáŹáş|á|ááŻááąáá|áááŹá¸|ááŤ|á
ááąáˇ|ááąáŹ|á|ááąáŹ|ááźááşááŹ|á
áŹ|áá˛áˇ|áá˝ááşááťá°ááŹ|áá˛áˇ|áá˛|áĄááŻááş|ááťáŹá¸|ááŤ|áááş
áááşá¸|á|ááąáŹ|ááŹ|áĄááŻááş|ááŻááş|ááŹ|áá˛|á
ááźáąáŹ|ááź|ááŤ|áĄáŻáśá¸
ááąáŹááŽ|áááşá¸|áááş|ááąáŹááş|ááťááş|áááş|ááźáąáŹ|áá˝áŹ
ááášáááąá¸|áážáŹ|ááąáŤáşáĄáąáŹááşáááşá¸á
áŻááźááş|ááááşáˇáá˝ááşá¸|ááźáąáŹ|áááş|áá˛áˇ|á
Phrase Segmentation ááŻááşááŹá Normalized pointwise mutual information (NPMI) áá˛áˇááŤá
Assoc. Prof. Daichi Mochihashi áá˛áˇ ááťáááşáááŻááąá¸ááŹá¸áá˛áˇ blog ááᯠáá˝áąáˇááźáŽá¸ ááźááşááŹá
áŹáĄáá˝ááş á
ááşá¸ááźááşáˇáááŻáˇ áĄááŻááşááŽáᏠááá˛áˇááŤáááşá áá° áážááşá¸ááźááŹá¸ááŹáááŻáᲠáĄááźáąááśááźáŽá¸ áááŹá
áŹáĄáá˝ááş á
ááşá¸áá˛áˇáá˛áˇ áĄáááŻááşá¸ááᯠáážááşá¸ááźáá˝áŹá¸ááŤáááşá
Wrod2Vec áá˛áˇ áááşáááşáá˛áˇ ááŹáááşááźáŽá¸ á áŹáááşá¸áážá áşá áąáŹááş ááᯠáĄáááşááŻáśá¸ refer ááŻááşááźááž áĄááąá¸á áááş ááŹááşáááşáááşááŤááááşáˇáááşá
áááá áŹáááşá¸ ááźá áşáá˛áˇ Efficient Estimation of Word Representations in Vector Space, (Mikolov et al., 2013) á áŹáááşá¸áá˛áážáŹ áĄáąáŹááşááŤáĄáááŻááşá¸ ááąáŹáşááźááŹá¸ááŹááᯠáá˝áąáˇáááŤááááşáˇáááşá
We have included in our test set only single token words, thus multi-word entities are not present (such as New York).
áááá áŹáááşá¸áá˛áˇ test set áážáŹ single token word áá˝áąáᲠááŻáśá¸ááŹá¸ááźáąáŹááşá¸ ááąáŹáşááźááŹá¸ááŤáááşá áááŻáááŻááŹá "New York", "ice cream", "high school", "hot dog", "living room", "full moon", "up to date", "part-time work", "state of the art" áááŻáˇááᯠá áŹááŻáśá¸ áážá áşááŻáśá¸áá˛áˇ áĄáááşáá˝á˛ááąáá˛áˇ á ááŹá¸ááŻáśá¸áá˝áą (word) áá˝áąááᯠword2vec áĄááąáá˛áˇ train ááŻááşáááşáááŻáááş áĄáááşááŻáśá¸ áĄááźá˛áááşá¸ áá˝á˛ááźáŽá¸ááŻáśá¸ááąáá˛áˇ á áŹááŻáśá¸áá˝á˛áá˝áą ááááşá¸áĄáŹá¸ááźááşáˇ phrase áá˝áąááᯠááŤáááŻáˇá ááźááŻáááááŻáˇ áááŻáĄááşááŤáááşá áĄá˛ááŽááᯠááááźáŽá¸áážáᏠword2vec ááᯠtrain áááŻááşáááşáážáŹ preprocessing áĄááąáá˛áˇ áĽááᏠ"new_york", "ice_cream", ..., "up_to_date", "part_time_work", "state_of_the_art" áĄááźá áş underscore áá˛áˇ áá˝á˛ááŹááťááŻá¸ ááŻááşááźáŽá¸ á áŹááŻáśá¸áá áşááŻáśá¸áĄááąáá˛áˇ training corpus áá˛áážáŹ ááźááŻááźááşááŹá¸áááŻáˇ áááŻáĄááşááŤááááşáˇáááşá áĄá˛áᎠáááŻááťááŻá¸ NLP task áĄáá˝ááşá supervised approach áá˛áˇ áááŻáááş NER (Name Entity Recognition) model áá˛áˇ ááŻááşáááŻáˇ áááąáá˛áˇ NER model ááąáŹááşáááŻáˇáĄáá˝ááşá NER corpus á áážáááąááž ááźá áşááŤááááşáˇáááşá áĄá˛ááŤááźáąáŹááşáˇ NER corpus ááᯠáááŻáśá¸áá˛áá˛áˇ unsupervised approach áĄááąáá˛áˇ áá˝áŹá¸áááşáááŻáááş áááşááᯠááŻááşáááŻáˇ ááááŻááşáááş áááŻááŹááᯠWord2Vec áá˛áˇááŻáááá áŹáááşá¸áááŻáˇ ááźáąáŹáááŻáˇááá˛áˇ Distributed Representations of Words and Phrases and their Compositionality, (Mikolov et al., 2013) á áŹáááşá¸áá˛áˇ Section 4. Learning Phrases áážáŹ Formula No. 6 áĄááąáá˛áˇ áĄáąáŹááşááŤáĄáááŻááşá¸ ááąáŹáşááźááŹá¸ááŹááᯠáá˝áąáˇáááŤááááşáˇáááşá
ááŽááąááŹáážáŹ ááźáąáŹááąáá˛áˇ n (v, w), n (v), n (w) áá˝áąá bigram áá˛áˇ unigram frequency áá˝áą ááźá áşááźáŽá¸ááąáŹáˇ δ á frequency ááááşáˇáá˛áˇ á ááŹá¸ááŻáśá¸áá˝á˛áá˝áąá ááááşáááŻááşá¸ááᯠááąáŹááşáááŹáááŻáˇáĄáá˝ááş ááááşá¸áážááá˛áˇ discount factor ááŤá Phrase áá˝áąááᯠáá˝á˛ááŻááşáááŻááşáááŻáˇáĄáá˝ááşá threshold áá áşáᯠáááşáážááşááŹá¸ááźáŽá¸ áĄá˛áᎠthreshold value áĄáááşáážáŹ áážááá˛áˇ bigram á ááŹá¸ááŻáśá¸áá˝á˛áá˝áąááᯠáá˝áąá¸áá°áááŻááşááŻáśááŤáá˛á Threshold value áĄáááş áááŻááŹááᯠprobability áĄááąáá˛áˇ á ááşá¸á áŹá¸ááźááşáˇáááş p (v, w) = n (v, w) / N, p (v) = n (v) / N, p (w) = n áááŻááźáŽá¸ ááąáŹáşááźá°ááŹáĄááąáá˛áˇ ááąá¸áááŻáˇ áááŤáááşá ááŽááąááŹáážáŹ "N" áááŻááŹá unigram á áŻá áŻááąáŤááşá¸áááşáááŻá¸ááŤá δ ááᯠáááşááźáŽá¸ááąáŹáˇ score áá˝ááşáááŻáˇáĄáá˝ááş á ááşá¸á áŹá¸áááş áĄáąáŹááşááŤáĄáááŻááşá¸ ááąá¸áááŻáˇ áááŤáááş
score (v, w) = n (v, w) / (n (v) * n (w)) = (p (v, w) * N) / (p (v) * N * p (w) * N) = p (v, w) / (p (v) * p (w) * N)
ááŤááźáąáŹááşáˇ áᎠscore áá˝ááşáá˛áˇ áĄáááŻááşá¸á self-mutual information PMI áá˝ááşáá˛áˇ PMI (v, w) = log p (v, w) / (p (v) * p (w)) áááŻáá˛áˇ ááąáŹáşááźá°ááŹáá˛áˇ áĄááŻááşááŻáśá¸áááŻááᯠáááşáá°ááźá áşááŹááᯠáá˝áąáˇáááŤááááşáˇáááşá ááŤááąáá˛áˇ ááąááąááťáŹááťáŹ ááźááş áážááŻááşá¸áážááşááźááşáˇáá˛áˇ áĄááŤáážáŹá áĄáąáŹáşáááťááşáááş ááąáŹáşááźá°ááŹáážáŹá 1/N áááŻáá˛áˇ factor á ááŤáááşááźáŽá¸ááąáŹáˇ áĄá˛ááŤá corpus áĄááąáŤáşáážáŹ áá°áááşááąáááŻáˇ áá˝ááşááŹáááşáˇ score á áĄááźáąááśáĄáŹá¸ááźááşáˇ corpus áá˛áˇ length ááąáŤáşáážáŹ áá˝áŹá¸ááźáŽá¸ áá°áááşááąááŤáááşá corpus ááᯠáĄááźáąáŹááşá¸áĄáᲠáááşáááŻá¸ááŹááťááŻá¸ áááŻááşáᲠfixed ááŻááşááŹá¸ááźáŽá¸ááąáŹáˇ threshold áááşáááŻá¸ááᯠsearch ááŻááşááŹááťááŻá¸ááŻááşáááşááąáŹáˇ áĄáááŻááşá¸áĄáᏠáá áşááŻáĄáá ááźáąáááşááąáá˛áˇ threshold áá˛áˇ áĄáááášááŤááşá ááŹá¸áááşááááşáá˛áˇáĄááźááş length ááá°áá˛áˇ á áŹááźáąáŹááşá¸áá˝áąááᯠááŻáśá¸ááźáŽá¸ááąáŹáˇ score áá˝áąááᯠáážááŻááşá¸áážááşááźááşáˇááźáŽá¸áá˝áŹá¸áááşáááŻáááş áááŹáá˛áˇ phrase áá˝áąá ááŻáśáážááş áá°áá˝áąá ááŻáśá¸ááąááźáá˛áˇ phrase áá˛áˇááąáŹáˇ ááááşáááşá¸ ááťáážáŹ áááŻááşááŤáá°á¸á
corpus ááᯠindependent ááźá áşáááŻáˇáĄáá˝ááşá original score áááşáááŻá¸ááᯠN áá˛áˇ ááźážáąáŹááşáááŻáˇ áááŤáááşá áááŻáˇááąáŹáş áĄááŻááźáąáŹááąáá˛áˇ score áááŻááŹá PMI ááᯠáá˝ááşáᏠááźá áşááŹááźáąáŹááşáˇ
- PMI áá˛áˇá áĄáŹá¸áááşá¸ááťááşá low frequency word áá˝áąááᯠáĄáŹá¸áááşá¸ááŹ
- PMI scale ááááşá¸ ááąááŹááąáŤáşáá°áááşááźáŽá¸ááąááŹ
á
áá˛áˇ áĄááťááşáá˝áąáááşá¸ áážáááŹááźáąáŹááşáˇ Normalized PMI (NPMI) (Bouma 2009) ááᯠááŻáśá¸áááşáˇáááşáááŻáˇ áááşááŤáááşá
NPMI áááŻááŹá áĄáąáŹááşááŤáĄáááŻááşá¸ áááşáážááşááŹá¸ááŤáááşá
NPMI (v, w) = log p (v, w) / (p (v) * p (w)) / (-log p (v, w))
NPMI ááᯠ-1âŚNPMI(v,w)âŚ1 áááŻáá˛áˇ range áĄáá˝ááşá¸áážáŹ áááşáážááşááŹá¸ááŹááźáąáŹááşáˇ 1 ááźá áşááąáá˛áˇ áĄááťáááşáážáŹ v áá˛áˇ w áááŻáˇáᏠáááŻááşáááŻááş correlation ááźá áşááąááźáŽá¸ -1 ááźá áşááąáá˛áˇ áĄááťáááşáážáŹááąáŹáˇ inverse correlation ááźá áşááąááźáąáŹááşá¸ááᯠááŹá¸áááşá áá˝ááşáá°ááŤáááşá ááźáŽá¸ááąáŹáˇ PMI áážáŹááŻááşá¸á áážááá˛áˇáá˛áˇ "p(v)" áááŻáˇ "p(w)" áááŻáˇáá˛áˇ áááşáááŻá¸áá˝áąá áĄáááşá¸ ááąá¸áááşáá˛áˇ áĄááŤáážáŹ score ááᯠááąáŹááşá¸áá˝á áąáááŻááşáá˛áˇ áĄáŹá¸áááşá¸ááťááşáááŻáááşá¸ áážáąáŹááşááźáŽá¸áá˝áŹá¸ ááźá áşáá˝áŹá¸ááŤááááşáˇáááşá áĄá˛ááŽáááŻááŹáááŻáááş Word2vec áá˛áˇ áĄáąáŹáşáááťááşáááşá áŹáááşá¸áážáŹ ááŻáśá¸áá˛áˇáá˛áˇ heuristic discount coefficient áááşáááŻá¸ ááźá áşáá˛áˇ δ áááşá¸ ááááŻáĄááşááąáŹáˇááŤáá°á¸á
áĄá˛ááŤááźáąáŹááşáˇ script áá áşááŻááş ááąá¸ááźáŽá¸ááąáŹáˇ phrase áĄáąáŹáşáááŻááźááşááŹááᯠá ááşá¸ ááźááşáˇááźá áşáá˛áˇááŤáááşá Phrase recognition áááŻáˇáááŻááş phrase segmentation ááŻááşáá˛áˇ core áĄáááŻááşá¸áááŻáᲠááąá¸áááŻáˇáĄáá˝ááş unigram, bigram frequency áá˝áąááᯠdictionary áážá áşááŻáĄááąáá˛áˇ ááááşá¸ááŹá¸áá˛áˇááźáŽá¸á word bigram (v, w) á phrase ááźá áşáááźá áşááᯠááŻáśá¸ááźááşáá˛áˇ áĄáááŻááşá¸áááŻáᲠPython script áá˛áˇ ááąá¸ááźááááş áĄáąáŹááşááŤáĄáááŻááşá¸ ááźá áşááŤááááşáˇáááşá
def compute_phrase (unigram, bigram, threshold = 0.5):
N = sum (list (unigram.values ââ()))
phrases = {}
for bi, freq in bigram.items ():
if freq> 1:
v = bi [0]; w = bi [1]
npmi = (log (N) + log (freq) --log (unigram [v]) --log (unigram [w])) \
/ (log (N) --log (freq))
if npmi> threshold:
phrases [bi] = npmi
return phrases
Threshold áááşáááŻá¸á ááťáááşá
áŹáĄáá˝ááşá 0.5 ááŹá¸ááźáŽá¸ á
ááşá¸áá˛áˇááąáá˛áˇ ááźááşááŹá
áŹáĄáá˝ááşá (0.1...0.5) ááŹá¸ááźáŽá¸ áĄááťááŻá¸ááťááŻá¸ á
ááşá¸ááźááşáˇáá˛áˇááŤáááşá
áĄáááşá፠algorithm ááᯠword segmentation ááŻááşááŹá¸áá˛áˇ ááźááşááŹá
Ꮰcorpus áá
áşááŻááŻáśá¸ááᯠpass ááŻááşááźáŽá¸áá˝áŹá¸áá˛áˇ áĄááŤáážáŹ á
áŹááŻáśá¸áážá
áşááŻáśá¸áá˝á˛ á
ááŹá¸á
ᯠ(two-word phrase) áá˝áąááᯠááážáááŹáážáŹ ááźá
áşááŤáááşá ááááşáááŻáˇ ááŻááááĄááźáááş pass ááŻááşááźáŽá¸áá˝áŹá¸áááşááąáŹáˇ á
áŹááŻáśá¸ áážá
áşááŻáśá¸ áááą ááąá¸ááŻáśá¸áĄáá áá˝á˛ááťááşáážáááąáááşáá˛áˇ á
ááŹá¸á
ᯠ(two- to four-word phrase) áá˝áąááᯠááážáááŹáážáŹ ááźá
áşááŤáááşá áĄá˛ááŤááźáąáŹááşáˇ ááŽáĄááŻááŽáĄááááąáŹáˇ passing ááᯠn pass áĄáá ááŻááşáááş áááŻáááş 2 áááą 2^n á
áŹááŻáśá¸áá˝á˛ phrase áá˝áąááᯠááážááááŻááşáážáŹ ááźá
áşááŤáááşá
áááşáá˛áˇá áŹááŻáśá¸ ááźááşááŹá¸áá˛áˇ (i.e. manual word segmentation) ááŻááşááŹá¸áá˛áˇ á áŹááźáąáŹááşá¸ááą á ááááşá¸ááťáąáŹáş áážááá˛áˇ ááźááşááŹá Ꮰcorpus ááᯠááŻáśá¸ááźáŽá¸ phrase segmentation experiment áááťááŻáˇ ááŻááşááźááşáˇááźááĄáąáŹááşá
Threshold value=0.1, frequency=3, 1 time pass áĄááąáá˛áˇ run ááźááşáˇááŹá¸ááŤáááşá
$ time python ./myword.py train_phrase -l 1 -t 0.1 -f 3 --unigram_phrase_txt unigram.l1.t0.1f3.txt --bigram_phrase_txt bigram.l1.t0.1f3.txt --unigram_phrase_bin unigram.l1.t0.1f3.bin --bigram_phrase_bin bigram.l1.t0.1f3.bin ./corpus2 ./train.l1t0.1f3.out
{'command': 'train_phrase', 'iteration': 1, 'threshold': 0.1, 'minfreq': 3, 'unigram_phrase_txt': 'unigram.l1.t0.1f3.txt', 'bigram_phrase_txt': 'bigram.l1.t0.1f3.txt', 'unigram_phrase_bin': 'unigram.l1.t0.1f3.bin', 'bigram_phrase_bin': 'bigram.l1.t0.1f3.bin', 'input': './corpus2', 'output': './train.l1t0.1f3.out'}
computing phrases: threshold = 0.1 minfreq = 3
pass [1/1]..
- computing phrases..
- writing output..
done.
real 1m4.555s
user 1m3.892s
sys 0m0.484s
pass á áá áşááŤáᲠááŻááşááŹáááŻáˇ corpus áá˛áážáŹ ááŤáááşáá˛áˇ bigram á áŹááŻáśá¸áá˝á˛áá˝áąáá˛áˇ frequency ááąáŤáşáá°áááşááźáŽá¸ threshold value ááąáŤáşááᯠáá°áááşááźáŽá¸ áá˝á˛ááŻááşáááŻáˇ áááŹáá˛áˇ ááźááşááŹá Ꮰphrase áĽááᏠáááťááŻáˇá áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
$ tail ./train.l1t0.1f3.out
áá°_áᏠáááşáážáąáˇáá˝á˛ áážáŹ áĄáááŻááş_á áááŻááş á
ááŹ_áážá áááş
áá°_áᏠáááşáážáąáˇ áááŻá¸áááşáá˝á˛ áážáŹ_áážáŻáśá¸ááááşáˇ áááŻáˇ_á ááźá
áş_áááŻááş ááąáŹááş áá°á¸
áá°áááş_áááąá¸ áᏠááŤá¸_ááťážáŹá¸ ááą_áááş
áá° ááśááąáŹááşá¸ áááş ááŤá¸ áá
áş_ááąáŹááş áá áááŻááş áááş
áá
áşáááŻááşá¸ áᏠááááş_á áááŻááş áá°á¸
áááşá¸ ááŹâ ááťááŻá¸ ááťááş ááťááŻá¸_áá˝áŹá¸ áááŻááş áááş
áá
áşáááŻááşá¸_ááťááŻá¸ ááť_áá˝áŹá¸ áááş_ááąáŹááşáááąá¸ áᏠááźá
áş_áᲠááᯠááť_áá˝áŹá¸ áááŻáˇ áĄááŹá¸áĄááŹ_áážá áááş
áá° ááźá
áş_áᲠááᯠááť_áá˝áŹá¸ áááş áá° ááąá
áᯠáááŻáˇ ááźá
áş ááąáŹááşá¸ ááźá
áş_áááŻááş ááááşáˇ_áááş
ááŻááşááŻáś áá˛_áážáŹ ááťáŹá¸ áá
áş_ááąáŹááş áážá_áááş
áááşá¸ ááŹ_ááŻááş áááŻááş áááş_áááŻáˇ áááşááťáŹá¸ áááş_ááá˛
Threshold value=0.1, frequency=3, 2 time pass ááŹá¸ááźáŽá¸ run ááŹá¸ááŤáááşá
$ time python ./myword.py train_phrase -l 2 -t 0.1 -f 3 --unigram_phrase_txt unigram.l2.t0.1f3.txt --bigram_phrase_txt bigram.l2.t0.1f3.txt --unigram_phrase_bin unigram.l2.t0.1f3.bin --bigram_phrase_bin bigram.l2.t0.1f3.bin ./corpus2 ./train.l2t0.1f3.out
{'command': 'train_phrase', 'iteration': 2, 'threshold': 0.1, 'minfreq': 3, 'unigram_phrase_txt': 'unigram.l2.t0.1f3.txt', 'bigram_phrase_txt': 'bigram.l2.t0.1f3.txt', 'unigram_phrase_bin': 'unigram.l2.t0.1f3.bin', 'bigram_phrase_bin': 'bigram.l2.t0.1f3.bin', 'input': './corpus2', 'output': './train.l2t0.1f3.out'}
computing phrases: threshold = 0.1 minfreq = 3
pass [1/2]..
- computing phrases..
- writing output..
pass [2/2]..
- computing phrases..
- writing output..
done.
real 1m38.575s
user 1m37.342s
sys 0m1.125s
ááŽáá áşááŤááąáŹáˇ passing ááᯠáážá áşá፠ááŻááşááŹá¸ááŹáááŻáˇ á áŹááŻáśá¸ áážá áşááŻáśá¸áá˝á˛ phrase áá˝áąááŹáááᲠááŻáśá¸ááŻáśá¸áá˝á˛á ááąá¸ááŻáśá¸áá˝á˛ phrase áá˝áąáááşá¸ áá˝á˛ááŻááşááŹáááŻááşááŹááᯠáá˝áąáˇáááŤááááşáˇáááşá
$ tail ./train.l2t0.1f3.out
áá°_áᏠáááşáážáąáˇáá˝á˛ áážáŹ áĄáááŻááş_á áááŻááş á
ááŹ_áážá_áááş
áá°_áᏠáááşáážáąáˇ áááŻá¸áááşáá˝á˛ áážáŹ_áážáŻáśá¸ááááşáˇ áááŻáˇ_á_ááźá
áş_áááŻááş ááąáŹááş_áá°á¸
áá°áááş_áááąá¸ áᏠááŤá¸_ááťážáŹá¸ ááą_áááş
áá° ááśááąáŹááşá¸_áááş ááŤá¸_áá
áş_ááąáŹááş áá áááŻááş_áááş
áá
áşáááŻááşá¸ áᏠááááş_á áááŻááş áá°á¸
áááşá¸ ááŹâ ááťááŻá¸ ááťááş ááťááŻá¸_áá˝áŹá¸ áááŻááş_áááş
áá
áşáááŻááşá¸_ááťááŻá¸ ááť_áá˝áŹá¸ áááş_ááąáŹááşáááąá¸ áᏠááźá
áş_áá˛_ááᯠááť_áá˝áŹá¸ áááŻáˇ_áĄááŹá¸áĄááŹ_áážá áááş
áá° ááźá
áş_áá˛_ááᯠááť_áá˝áŹá¸ áááş áá° ááąá
áᯠáááŻáˇ ááźá
áş ááąáŹááşá¸_ááźá
áş_áááŻááş ááááşáˇ_áááş
ááŻááşááŻáś_áá˛_áážáŹ ááťáŹá¸_áá
áş_ááąáŹááş áážá_áááş
áááşá¸ ááŹ_ááŻááş áááŻááş_áááş_áááŻáˇ áááşááťáŹá¸ áááş_ááá˛
Threshold value=0.1, frequency=1, 2 time pass ááŹá¸ááźáŽá¸ run ááŹá¸ááŤáááşá
$ time python ./myword.py train_phrase -l 2 -t 0.1 -f 1 --unigram_phrase_txt unigram.l2.t0.1f1.txt --bigram_phrase_txt bigram.l2.t0.1f1.txt --unigram_phrase_bin unigram.l2.t0.1f1.bin --bigram_phrase_bin bigram.l2.t0.1f1.bin ./corpus2 ./train.l2t0.1f1.out
{'command': 'train_phrase', 'iteration': 2, 'threshold': 0.1, 'minfreq': 1, 'unigram_phrase_txt': 'unigram.l2.t0.1f1.txt', 'bigram_phrase_txt': 'bigram.l2.t0.1f1.txt', 'unigram_phrase_bin': 'unigram.l2.t0.1f1.bin', 'bigram_phrase_bin': 'bigram.l2.t0.1f1.bin', 'input': './corpus2', 'output': './train.l2t0.1f1.out'}
computing phrases: threshold = 0.1 minfreq = 1
pass [1/2]..
- computing phrases..
- writing output..
pass [2/2]..
- computing phrases..
- writing output..
done.
real 1m57.006s
user 1m55.366s
sys 0m1.373s
áᎠáá áşááŤááąáŹáˇ frequency ááᯠáá áşááźáááşááŤááŹáá˛áˇ phrase áĄááźá áş áááşáˇáá˝ááşá¸á ááşá¸á áŹá¸áá˛áˇáĄáŻááşá áŻáĄáá˛ááᯠáááşááŹáážáŹáááŻáˇ áá˝á˛ááŻááşááźáŽá¸ áááŹáá˛áˇ phrase áá˝á˛áá˝áąáážáŹ áĄááźáąáŹááşá¸áĄáᲠááźá áşááŹááŹáááŻáááşá¸ ááźááşáá˝áąáˇááážáŹ ááźá áşááŤáááşá áĽááᏠ"áááşááťáŹá¸_áááş_ááá˛" ááᯠphrase áá áşááŻáĄááąáá˛áˇ áá˝á˛ááąá¸áá˝áŹá¸ááŹááťááŻá¸ááŤá
$ tail ./train.l2t0.1f1.out
áá°_ááŹ_áááşáážáąáˇáá˝á˛ áážáŹ áĄáááŻááş_á áááŻááş á
ááŹ_áážá_áááş
áá°_áᏠáááşáážáąáˇ_áááŻá¸áááşáá˝á˛_áážáŹ_áážáŻáśá¸ááááşáˇ áááŻáˇ_á_ááźá
áş_áááŻááş ááąáŹááş_áá°á¸
áá°áááş_áááąá¸_áᏠááŤá¸_ááťážáŹá¸_ááą_áááş
áá°_ááśááąáŹááşá¸ áááş ááŤá¸_áá
áş_ááąáŹááş áá áááŻááş_áááş
áá
áşáááŻááşá¸_áᏠááááş_á_áááŻááş áá°á¸
áááşá¸_ááŹâ_ááťááŻá¸ ááťááş_ááťááŻá¸_áá˝áŹá¸ áááŻááş_áááş
áá
áşáááŻááşá¸_ááťááŻá¸ ááť_áá˝áŹá¸_áááş_ááąáŹááşáááąá¸ ááŹ_ááźá
áş_áᲠááᯠááť_áá˝áŹá¸ áááŻáˇ_áĄááŹá¸áĄááŹ_áážá áááş
áá°_ááźá
áş_áᲠááᯠááť_áá˝áŹá¸ áááş áá° ááąá
ááŻ_áááŻáˇ ááźá
áş ááąáŹááşá¸_ááźá
áş_áááŻááş ááááşáˇ_áááş
ááŻááşááŻáś_áá˛_áážáŹ ááťáŹá¸_áá
áş_ááąáŹááş áážá_áááş
áááşá¸ ááŹ_ááŻááş áááŻááş_áááş_áááŻáˇ áááşááťáŹá¸_áááş_ááá˛
Threshold value=0.1, frequency=3, 2 time pass áááŻáá˛áˇ training áá˛áˇáᲠcorpus áá˛áááą áážááşáá˛áˇ á áŹááźáąáŹááşá¸áá˝áąááᯠáááą áááŹáá˛áˇ phrase áá˝áąáááŻáááşá¸ ááąáˇááŹááźááşáˇáááş áĄáąáŹááşááŤáááŻááťááŻá¸ á áááşáááşá áŹá¸á ááŹááąáŹááşá¸áá˛áˇ ááźááşááŹá Ꮰphrase áĄáá˝á˛áá˝áą ááááŻááşááŹááᯠááźááşáá˝áąáˇáááŤááááşáˇáááşá
$ shuf ./train.l2t0.1f3.out | head
ááŤ_ááźáąáŹááˇáş_á_ááťá˝ááşááąáŹáş áᏠáŠááŹ_áá˝ážááşá¸áááŻá¸ ááąá¸_áááşá¸ááźáąáŹááşá¸_ááᯠáᲠáááŻááş áá˛áˇ_áááş_á
ááŽá¸ááźáŹá¸ áĄááąáŹááˇáş_áá
áş_áᯠáážááşáˇ_áá°á¸áá˝á˛ á
áŹáááşá¸ áĄááąáŹááşáˇ_áá˝ááşáˇ ááŹá¸_ááźááşá¸_áááş áá˝áąááźáąá¸ ááźáżááŹ_áĄáááşá¸áááş áááŻ_ááťáąáŹáşáá˝ážáŹá¸ áááş_áĄáážááşááááş áĄááąáŹááşáĄáá°_ááźáŻ_áááŻááş ááŤ_áááş_á
áááş_áááş áááŻ_áááş_ááąáŹ đ_đ_đ
ááááşá¸áááąá¸ áĄáá˝ááş ááŹá¸_ááŤáážáááŻááş ááąáŹááşáťáŹá¸ááąá¸_áĄáá˝ááş ááŹá¸
áááşá¸ááŹ_áááŻááş_áᏠáááŻáááş_áááŻáˇ áááş_á áá˝ááşá¸_áá˝ááşá¸ áĄááźááş_áážáŹ áĄááźáŹá¸_áá
ášá
ááşá¸ ááąá¸_ááŤá¸ áááşá¸_áááŻáĄááş áááťáž_ááááˇáş ááź_á፠á_ááááˇáşááąáŹáşá ááᯠááŻáááŻááş ááąá¸_ááź_ááŤ
ááťáŹá¸ áááŻ_áá˛áˇ_ááášáá፠ááąá¸_áá˝áą_áᏠáá°áˇ_ááŹááŹ_ááᯠááŹ_ááž_á_ááŻááş ááą_áááˇáş áá° ááą_áá˛áˇ áĄáŻáś_ááᯠááťáŹá¸ áá˝áŹá¸ áááá áááŻááş áááŻáˇ_á_ááąáŹáˇ áĄááźáŻáśáááŻááş áá˝ááş_áᏠááźáŽá¸_ááŻááş áááş_áááŻ_áᏠáĄáŹá¸ááŻáśá¸_áá_ááź áážáŹ_ááŤ_á
áážáŻááşáááşá¸ááŽ_ááąá¸ áááşááąáŹáˇ_á_ááᲠááŻ_ááąá¸_áááş áááş_ááŹ_áᏠá፠ááŻááş_áá˝áŹá¸ áážáŹ_áááŻá¸_áááŻáˇ áá°á¸ ááąá¸ ááąáŹ áá°á¸ ááźáŽá¸ ááąáŹ_áááş áá˛áˇ_áááş ááťá
áş_áá˝áŹá¸_ááźáŽ áĄáááşááźáą_ááŹá¸_ááźááŻááş ááŹá¸_áážááˇáş áĄááŹá¸_áááş áááş_ááᯠááśááŤááş_áá_ááŻáśá¸ ááąáŹáş
Football_Observatory áá˝ááşááąáŹááşáááş áááŻ_áá°áááŻ_áááşá¸ áá_áĄááááşáˇááŻáśá¸_áĄááźáąáŹááşá¸áĄáá˝ážáąáˇ_ááąá¸ áĄááźá
áş_áááşáážááş_ááąáŹáşááź_ááŹá¸ ááŤ_áááş_á
ááśááŹááᎠááźáą áááŻ_áááşá¸_áá ááą_ááźáŽ_á
áááá_ááŻáážá
áş áááŹá¸áááźáŽá¸_áážáŻ_áĄáážááş_- áá
áááŻááşáážáŹá manual word segmentation ááŻááşááŹá¸áá˛áˇ corpus áááşá¸ ááážááá°á¸ áááŻáááşááąáŹáˇ myword á version áĄáááŻááş default áĄááąáá˛áˇ training ááŻááşááźáŽá¸ ááŻáśá¸ááŹá¸áá˛áˇ dictionary áááŻáᲠááŻáśá¸ááźáŽá¸ phrase segmentation ááŻááşááťááşáááş áááŻáááşááąáŹáˇ áĄáąáŹááşááŤáĄáááŻááşá¸ command ááąá¸ááŤá
$ python ./myword.py phrase ./test.space.txt ./test.phrase
{'command': 'phrase', 'threshold': 0.1, 'minfreq': 1, 'unigram_phrase_bin': 'unigram-phrase.bin', 'bigram_phrase_bin': 'bigram-phrase.bin', 'input': './test.space.txt', 'output': './test.phrase'}
computing phrases: threshold = 0.1 minfreq = 1
phrase segmentation...
- read unigram dictionary
- read bigram dictionary
- computing phrases..
- writing output..., filename: ./test.phrase
done.
áááşáážá default ááŹá¸ááŹá¸áá˛áˇ dictionary áá˛áˇ ááźááşááźáŽá¸ áááŹáá˛áˇ output á áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
$ cat ./test.phrase
ááťá˝ááşááąáŹáş_á ááŻááąáá áááŹá¸ ááŤ_á
ááąáˇ ááąáŹ á ááąáŹ_ááźááşááŹá
Ꮰáá˛áˇ áá˝ááşááťá°ááŹ_áá˛áˇ áᲠáĄááŻááş ááťáŹá¸ ááŤ_áááş
áááşá¸_á ááąáŹ_áᏠáĄááŻááş_ááŻááş ááŹ_áᲠá
ááźáąáŹ_ááź ááŤ_áĄáŻáśá¸
ááąáŹáᎠáááşá¸ áááş_ááąáŹááş ááťááş_áááş ááźáąáŹ áá˝áŹ
ááášáááąá¸_áážáŹ ááąáŤáş_áĄáąáŹááşáááşá¸á
áŻááźááş ááááşáˇáá˝ááşá¸_ááźáąáŹ áááş áá˛áˇ á
$ cat test.space.txt
ááťá˝ááşááąáŹáş á ááŻááąáá áááŹá¸ á፠á
ááąáˇ ááąáŹ á ááąáŹ ááźááşááŹá
Ꮰáá˛áˇ áá˝ááşááťá°áᏠáá˛áˇ áᲠáĄááŻááş ááťáŹá¸ á፠áááş
áááşá¸ á ááąáŹ áᏠáĄááŻááş ááŻááş áᏠáᲠá
ááźáąáŹ ááź á፠áĄáŻáśá¸
ááąáŹáᎠáááşá¸ áááş ááąáŹááş ááťááş áááş ááźáąáŹ áá˝áŹ
ááášáááąá¸ áážáŹ ááąáŤáş áĄáąáŹááşáááşá¸á
áŻááźááş ááááşáˇáá˝ááşá¸ ááźáąáŹ áááş áá˛áˇ á
ááááşáááŻáˇ áááŻááşáˇ word segmented corpus áá˛áˇ áĄááťááŻá¸ááťááŻá¸ training/experiment ááŻááşááŹá¸ááźáŽá¸ áááŻááşááŻáśá¸ááťááşáá˛áˇ dictionary ááᯠcommand line argument áĄááąáá˛áˇ assign ááŻááşááźáŽá¸ ááŻáśá¸ááťááşáááş áááŻáááşááąáŹáˇ áĄáąáŹááşááŤáĄáááŻááşá¸ run ááŤá
python ./myword.py phrase --unigram_phrase_bin ./unigram-phrase.bin --bigram_phrase_bin ./bigram-phrase.bin ./test2.txt ./test2.phrase
$ python myword.py -h
áááŻááźáŽá¸ command ááąá¸áááŻááşáááş myWord Segmentation Tool áá˛áˇ "main-help screen" ááᯠááźááşááážáŹ ááźá
áşááŤáááşá
$ python myword.py -h
usage: myword [-h] [-v]
{syllable,build_dict,word,train_phrase,phrase,npmi_train} ...
Syllable, Word, Phrase Segmenter for Burmese (Myanmar language)
positional arguments:
{syllable,build_dict,word,train_phrase,phrase,npmi_train}
syllable syllable segmentation with Regular Expression
build_dict building n-gram dictionaries for word segmentation
word word segmentation with Vitabi algorithm proposed by
Andrew James Viterbi, 1967
train_phrase training or building n-gram dictionaries for phrase
segmentation
phrase phrase segmentation with NPMI (Normalized Pointwise
Mutual Information) proposed by Bouma Gerlof, 2009
npmi_train training or building n-gram dictionaries with NPMI and
run segmentation experiment for x-unit (e.g.
character, syllable, sub_word, word) with built
dictionaries, the learning x-unit will depends on your
input file segmentation
optional arguments:
-h, --help show this help message and exit
-v, --version output version information and exit
áᎠááąááŹáážáŹ sub_option áá áşáᯠááťááşá¸á áŽáá˛áˇ áĄááŻááşááᯠáĄááźááşá¸áážááşá¸ááááş áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
- syllable (syllable segmentation ááŻááşáááŻáˇáĄáá˝ááş ááŻáśá¸áá˛áˇ option ááŤ)
- build_dict (unigram, bigram áĄááááŹááşáá˝áąááᯠááąáŹááşáááŻáˇáĄáá˝ááş ááŻáśá¸áá˛áˇ option ááŤ)
- word (Viterbi algorithm ááᯠááŻáśá¸ááźáŽ word segmentation ááŻááşáááŻáˇáĄáá˝ááş ááŻáśá¸áá˛áˇ option ááŤ)
- train_phrase (unigram, bigram á áŹááŻáśá¸áĄááááŹááş áážá áşááŻááąáŹááşááźáŽá¸ NPMI áá˛áˇ á ááŹá¸ááŻáśá¸áá˝á˛áá˝áą áááŻáˇáááŻááş phrase áá˝áąááᯠáá˝á˛ááŻááşáááŻáˇáĄáá˝ááş ááŻáśá¸áá˛áˇ option ááŤ)
- phrase (NPMI algorithm áá˛áˇ phrase segmentation ááŻááşáááŻáˇáĄáá˝ááş ááŻáśá¸áá˛áˇ option ááŤ)
- npmi_train (áᎠoption á NPMI algorithm áá˛áˇ training, segmentation ááᯠáááźáááşáááşáá ááŻááşáááŻáˇáĄáá˝ááş ááŻáśá¸áá˛áˇ option ááŤ)
"syllable", "build_dict", "word", "train_phrase", "phrase" and "npmi_train" option áá áşááŻááťááşá¸á áŽáĄáá˝ááş help screen ááᯠcommand-line-help-of-myword page ááᯠáááşááąáŹááşááźáŽá¸ ááąáˇááŹááŤá
ááááşá NPMI unsupervised approach áá˛áˇ phrase áá˝áąáᏠáááᲠcharacter sequence, syllable, sub_word, word á áá˛áˇ segmentation unit áá˝áąáááŻáááşá¸ learn ááŻááşááźáŽá¸ áá˝á˛ááŻááşááąá¸áááŻááşááŤáááşá áĄá˛ááŽáĄáá˝ááş learning/segmentation áĄááŻááşááᯠáĄááťááŻá¸ááťááŻá¸ experiment ááŻááşáááŻááşáááŻáˇáĄáá˝ááş "npmi_train" ááᯠmyWord Segmentation Tool áá˛áˇ facility áá áşááŻáĄááąáá˛áˇ áááşáˇááąá¸ááŹá¸ááŹááŤá
ááŹá¸áááşáá˝ááşáĄáąáŹááş corpus áĄááąá¸ááąá¸áá áşááŻááąáŹááşááźáŽá¸ááąáŹáˇ run ááźááşáˇááźááĄáąáŹááşá áááŻááźááŤá ááŻáˇ ááťá˝ááşááąáŹáşáááŻáˇáá˛áˇ corpus áážáŹá áááşáááşááááŻáá˛áˇááźáá˛áˇ áááťáŹáááŹááźáŽá¸ áĽáŽá¸áááşáááŻá¸áá˛áˇ "áá áá" áááťáŹááᯠáááŻááşáááşáˇááŹá¸áá˛áˇ á áŹááźáąáŹááşá¸áá˝áąáážááááşáááŻáˇá áá áşááŻáážáááŹá npmi_train áá˛áˇ learn ááŻááşáááŻáˇá segmentation boundary áá áşááŻááąáŹáˇ ááąá¸ááážáŹáááŻáˇ syllable áá áşááŻááťááşá¸á áŽááᯠspace ááźáŹá¸ááźáŽá¸ áááŻááşáááşáˇááŹá¸ááŤáááşá áĄá˛áᎠcorpus áááŻááşáĄááąá¸ááąá¸á áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
$ cat ./mama_wawa_poem.txt
á á á á
á á á
ᥠá á á á á
á á፠á ááŤ
á á ááŹ
á á á áᏠááŹ
á ᥠááŤ
á፠á
Ꮰá
á á á á
á á á á
myWord Segmentation Tool áá˛áˇ npmi_train option ááᯠááŻáśá¸ááźáŽá¸ááąáŹáˇ segmentation experiment áĄááąá¸ááąá¸áá áşáᯠááŻááşááźááşáˇááźááĄáąáŹááşá
- -lr áááŻáˇáááŻááş --iteration_range ááᯠ"1,2" ááŹá¸áááşá áá˝á˛ááŻááşáááşáˇ á áŹááŻáśá¸ length á 2 to 4 áááŻááźáŽá¸ áááşáážááşááąá¸áááŻááşááŹááŤá
- -tr áááŻáˇáááŻááş --threshold_range áááŻááąáŹáˇ "0.1,0.1" áááŻááźáŽá¸ ááŹá¸áááŻááşáááşá áááŻáááŻááŹá corpus ááááşá¸ á áŹááźáąáŹááşá¸ááą ááááźáąáŹááşá¸áᲠáážáááźáŽá¸ áĄáááşá¸ááąá¸ááŹááźáąáŹááşáˇ threshold value áááŻááąáŹáˇ ááá áŹá¸ááąáŹáˇáá°á¸á
- -fr áááŻáˇáááŻááş --minfreq_range áááŻááąáŹáˇ "2,3" áááŻááźáŽá¸ áááşáážááşáááŻááşáááşá corpus áá˛áážáŹ áĄáááşá¸ááŻáśá¸ áážá áşá፠áááą ááŻáśá¸ááŤááźáŹá¸ ááŤáážáᲠphrase áĄááźá áşáááşáážááşáááŻáˇ áááşáˇáá˝ááşá¸á ááşá¸á áŹá¸á፠áááŻáˇ setting ááŻááşááŹááŤá ááŽááąááŹáážáŹááąáŹáˇ phrase áááŻááŹá syllable áá˝á˛áá˝áą áá˛ááźá áşááŹáážáŹááŤá ááŹááźáąáŹááşáˇáᲠáááŻááąáŹáˇ input ááŻááşáááşáˇ training corpus áá˛áážáŹ ááźááşááŹá¸ááŹá áĄáááşáážáŹ ááźáá˛áˇáááᯠsyllable breaking ááŻááşááŹá¸ááŹááźáąáŹááşáˇááŤá
ááááşáááşá¸ run áá˛áˇáĄááŤáážáŹááąáŹáˇ áĄáąáŹááşá፠áĄáááŻááşá¸ command ááąá¸ááźáŽá¸ááąáŹáˇ myword.py ááᯠrun ááźááşáˇááŤá
$ time python ./myword.py npmi_train -lr "1,2" -tr "0.1,0.1" -fr "2,3" ./mama_wawa_poem.txt
corpus ááááşá¸ ááĄáŹá¸ááąá¸ááŹááźáąáŹááşáˇ training ááŻááşáá˛áˇ áĄááťáááşá áá
áášáááşáˇáĄáá˝ááşá¸áážáŹáᲠááźáŽá¸áá˝áŹá¸ááŤááááşáˇáááşá
learning ááŻááşááźáŽá¸ áááŹáá˛áˇ á
áŹááŻáśá¸áá˝áąááźááşááąá¸ááŹá¸áá˛áˇ (i.e. segmented output file) áááŻááşáá˝áąááᯠcommand-line áážáŹ áááŻááşááŻááşááąá¸áááŻáˇáĄáá˝ááş áĄáąáŹááşááŤáááŻááťááŻá¸ command ááąá¸áááŻáˇ áááŤáááşá
for i in mama_wawa_poem.txt.l{1..2}.t0.1.f{2..3}.seg;do echo -e "\n"$i":"; cat $i; done;
áááááŻáśá¸ áĄááąáá˛áˇ "l1.t0.1.f2" (i.e. iteration=1, threshold=0.1, minfreq=2) áá˛áˇ "l1.t0.1.f3" (i.e. iteration=1, threshold=0.1, minfreq=3) áááŻáˇáážá áşáᯠáĄááźáŹá¸ áááŹáá˛áˇ segmented output áááŻááş áážá áşáááŻááşááᯠside-by-side áážááŻááşá¸áážááşááźááşáˇááźááĄáąáŹááşá Underscore "_" áá˛áˇ áá˝á˛ááąá¸ááŹá¸ááŹá NPMI algorithm áá˛áˇ learn ááŻááşááźáŽá¸ áááŹáá˛áˇ á áŹááŻáśá¸áá˝á˛áá˝áąááŤá frequency=3 áĄááźá áş áááŻá¸áááŻááşáá˛áˇáĄááŤáážáŹ áá˝á˛ááŻááşáááŻááşáá˛áˇ á áŹááŻáśá¸áĄááąáĄáá˝ááşá áááşá¸áá˝áŹá¸ááŹááᯠááźááşáá˝áąáˇáááŤááááşáˇáááşá áĄá˛ááŤááźáąáŹááşáˇ "npmi_train" ááᯠááŻáśá¸ááźáŽá¸ phrase áá˝áąááᯠáá˝á˛ááŻááşáá˛áˇ áĄááŤáážáŹ frequency áááŻáá˛áˇ setting ááááşá¸ áááŻááşáˇ corpus áá˛áˇ áááŹááĄááąáŤáşááᯠáá°áááşááźáŽá¸ ááťáááşáááźáŽá¸ááž áááşáážááşááŤá
mama_wawa_poem.txt.l1.t0.1.f2.seg | mama_wawa_poem.txt.l1.t0.1.f3.seg |
---|---|
|
|
ááŽáá áşááŤááąáŹáˇ áĄááąáá˛áˇ "l2.t0.1.f2" (i.e. iteration=2, threshold=0.1, minfreq=2) áá˛áˇ "l2.t0.1.f3" (i.e. iteration=1, threshold=0.1, minfreq=3) áááŻáˇáážá áşáᯠáĄááźáŹá¸ NPMI á learn ááŻááşááźáŽá¸ áááŹáá˛áˇ segmented output áááŻááş áážá áşáááŻááşááᯠside-by-side áážááŻááşá¸áážááşááźááşáˇááźááĄáąáŹááşá "iteration" ááᯠtwo pass ááŻááşáááŻááşááŹááźáąáŹááşáˇ syllable ááąá¸ááŻáśá¸áá˝á˛á áŹááŻáśá¸áá˝áą áĄáá áá˝á˛ááŻááşáá°ááŹáááŻááşááŹááᯠ"mama_wawa_poem.txt.l2.t0.1.f2.seg" áááŻááşáá˛áážáŹ áááşáááşáážáŹá¸áážáŹá¸ ááźááşáááŤááááşáˇáááşá áááŻáˇááąáŹáş "min-freq" ááᯠ"3" áĄááźá áş ááŹá¸ááŹá¸áááŻááşáá˛áˇ áĄááŤáážáŹááąáŹáˇ corpus áá˛áážáŹá ááŻáśá¸á፠ááážáááŹááźáąáŹááşáˇ syllable áážá áşááŻáśá¸áá˝á˛á áŹááŻáśá¸áá˝áą (i.e. á_á) áááŻáᲠ"mama_wawa_poem.txt.l2.t0.1.f3.seg" áááŻááşáá˛áážáŹ ááŤááŹááŹááᯠáá˝áąáˇáááŤááááşáˇáááşá ááźáąáŹááááşááąáŹáˇ "npmi_train" argument ááᯠááŻáśá¸áá˛áˇáĄááŤáážáŹ option ááŻáśá¸ááŻááźá áşáá˛áˇ "--iteration_range", "--threshold_range" áá˛áˇ "--minfreq_range" ááŻáśá¸ááŻá ááŻáśá¸á áĄááąá¸ááźáŽá¸ááŤáááşá áĄá˛áᎠparameter ááŻáśá¸ááŻáĄááąáŤáşááᯠáá°áááşááźáŽá¸ááąáŹáˇ áááŹáá˛áˇ phrase áá˝áąááááşá¸ áĄááźáąáŹááşá¸áĄáᲠááźá áşáá˝áŹá¸áážáŹ ááźá áşááŤáááşá Experiment ááᯠáĄááťááŻá¸ááťááŻá¸ ááŻááşááźááşáˇááźááŤáááŻáˇ áĄááźáśááąá¸ááťááşááŤáááşá
mama_wawa_poem.txt.l2.t0.1.f2.seg | mama_wawa_poem.txt.l2.t0.1.f3.seg |
---|---|
|
|
áᎠREADME áááŻááşáážáŹ áážááşáááá˝ááşááźáŽá¸ááąáŹáˇ ááźááşááŹáĄáąáŹááş áážááşá¸ááźáááŻááşáááŻáˇáĄáá˝ááş ááááşááŻááşáá˛áˇáá˛áˇ "áá áá" experiment log áááŻááşááᯠáááşá¸áááşááąá¸ááŹá¸ááŤáááşá
Link: https://github.com/ye-kyaw-thu/myWord/blob/main/documentation/mama_wawa-exp1.md
á
áŹááźáąáŹááşá¸ááą áá
áşááąáŹááşáážááá˛áˇ corpus áá˛áˇ á
ááşá¸ááźááŹá¸ááŹáááŻáááşá¸ ááąáˇááŹáááŻááşáĄáąáŹááş áááşááąá¸ááŹá¸ááŤáááşá áĄáąáŹááşá፠link áážáŹ áááşááźááşáˇááŤá
https://github.com/ye-kyaw-thu/myWord/blob/main/documentation/npmi_train-option-test-with-1k-corpus.md
Current Version: Version 1.0
Word áĄáá˝ááşááąáŹ Phrase áĄáá˝ááşááąáŹ default ááąáŹááşááąá¸ááŹá¸áá˛áˇ ngram dictionary áá˝áąá ./dict_ver1/ áááŻáá˛áˇ folder áĄáąáŹááşáážáŹ áážáááąááŤááááşáˇáááşá
- unigram-word.bin
- unigram-word.txt
- bigram-word.bin
- bigram-word.txt
- unigram-phrase.bin
- unigram-phrase.txt
- bigram-phrase.bin
- bigram-phrase.txt
â myWord Segmentation Tool ááᯠáááŻááşáˇá
ááşáá˛áážáŹ download ááŻááşááźáŽá¸áááŻáˇ run áááŻááşáááşáážáŹ combine-all-splitted-files.sh ááᯠáĄáááş run áááŻáˇ áááąáˇááŤáá˛áˇá
(split-lt-24mb.sh á áááŻááşáá˝áąááᯠsmall áááŻááşáá˝áąáĄááźá
áşáá˝á˛áááŻáˇáĄáá˝ááş run áá˛áˇáá˛áˇ script, áᎠáááŻááşá run á
áᏠááááŻáá°á¸)
Coding ááᯠáááşááźááşááťááşáá˛áˇ áá°ááťáŹá¸áĄáá˝ááşá...
- myword.py (main program of myWord Segmentation Tool)
- phrase_segment.py (module for phrase segmentation and training with NPMI Algorithm)
- syl_segment.py (module for syllable segmentation)
- word_dict.py (module for word unit ngram dictionary building)
- word_segment.py (module for word segmentation with Viterbi Algorithm)
myWord Segmentation Tool ááᯠdownload ááŻááşááźáŽá¸ááŹáá˛áˇ áááŻááşáˇá ááşáá˛áážáŹ testing ááŻááşááźááşáˇáááŻáˇáĄáá˝ááş ááźááşááŹá áŹááąááŹáááŻááşáá˝áąá...
- test1.txt (á áŹááźáąáŹááşá¸ ááźáąáŹááşááźáąáŹááşá¸áᲠáážááá˛áˇ ááźááşááŹá ᏠUTF-8 text áááŻááşá space áá˝áąááᯠá áŹááźáąáŹááşá¸áááŻááşá¸áááŻááᯠááźáŻááşááŹá¸ááźáŽá¸ááŹá¸)
- test2.txt (word ááźááşááŹá¸áá˛áˇ ááźááşááŹá ᏠUTF-8 text áááŻááşá á áŹááźáąáŹááşá¸ áĄááąáĄáá˝ááşá á áŻá áŻááąáŤááşá¸ áĄááźáąáŹááşá¸ áá áá˛áˇ word áĄááąáĄáá˝ááşá á á áááŻáśá¸ áážááááş)
- mama_wawa_poem.txt (syllable segmentation ááźááşááŹá¸áá˛áˇ áááťáŹáááŹááźáŽá¸ áĽáŽá¸áááşáááŻá¸áá˛áˇ "áá áá" áááťáŹáááŻááşááŤá npmi_train experiment áĄáá˝ááş ááá°áᏠááŻáśá¸ááźááŹá¸áá˛áˇ input áááŻááşááŤ)
áááşáážá Folder áá˝áąáá˛áˇ áááşáááşááźáŽá¸ ááźáąáŹááźááááş...
- dict_ver1/ (myWord corpus ááᯠááŻáśá¸ááźáŽá¸ááąáŹáˇ ááąáŹááşááŹá¸áá˛áˇ ngram dictionary version.1.0 ááᯠááááşá¸ááŹá¸áá˛áˇ folder)
- documentation/ (README áááŻááşáážáŹ ááŻáśá¸ááŹá¸áá˛áˇ figures áá˝áą, experiment/running log files áááťááŻáˇ)
- tools/ (áᎠfolder áĄáąáŹááşáážáŹááąáŹáˇ preprocessing áĄááŻááşáááŻáˇá myWord Segmentation Tool ááᯠrun áááŻáˇáĄáá˝ááş ááźááşáááŹáá˛áˇ áááŻááşáá˛áˇ script áá˝áąá input áááŻááşáĄááąáŤáşááᯠáá°áááşááźáŽá¸ segmentation ááŻááşááźáŽá¸áá˝áŹá¸áá˛áˇáĄááŤáážáŹ áááŻááąáá˛áˇ space áá˝áąáážááááş space cleaning ááŻááşáááŹááťááŻá¸áááşá¸ áážááááşáááŻáˇ... áĄááŻáśá¸áááşáááŻááşáááşáˇ script áá˝áąááᯠáááşáˇááąá¸ááŹá¸ááŤáááş)
áááşáážá release áááŻááşáááş á ááşá¸ááąáá˛áˇ ngram dictionary áá˝áąáá˛áˇ evaluation ááŻááşááŹá¸áá˛áˇ ááááşáá˝áąáááŻáááşá¸ ááąáˇááŹáááŻáˇ ááĄáąáŹááş README áááŻááşáážáŹ áááşááąá¸ááŹá¸áááŻááşááŤáááşá (áĄááťáááşááá˛áˇáááşááąáŹáˇ ngram áĄááááŹááşáá˝áąááᯠcleaning áááşááŻááşááźáŽá¸ áááşáááŻáˇ áááşáá˝ááşááŹá¸ááŤáááşá áĄá˛ááŤáááŻáááş ááááşáá˝áąá áááşáážá áááşááąáŹááş áááŻááąáŹááşá¸ááŹáááŻááşááŤáááş)
"Closed testing" áááŻááŹá ngram áĄááááŹááşááᯠááąáŹááşáá˛áˇáĄááťáááşáážáŹ ááŻáśá¸ááŹá¸áá˛áˇ corpus áá˛á á áŹááźáąáŹááşá¸áá˝áąáá˛áˇáᲠword segmentation ááŻááşááźááşáˇááźáŽá¸ test ááŻááşáᏠááźá áşááŤáááşá Closed test áĄáá˝ááş ááŻáśá¸áá˛áˇáá˛áˇ test áááŻááşá á áŹááźáąáŹááşá¸ááą á áŻá áŻááąáŤááşá¸ áááá ááŤá áĄááąá¸á áááş information á áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
- 1000 (no. of sentences)
- 38451 (no. of words)
- 477524 (no. of characters)
$ wc corpus2.1k
1000 38451 477524 corpus2.1k
word segmentation ááŻááşááźáŽá¸ áá˝ááşááŹáá˛áˇ output áááŻááşáá˛áˇ áááşáááşáá˛áˇ á áŹááźáąáŹááşá¸ááą áĄááąáĄáá˝ááşá á áŹááŻáśá¸ááąáĄááąáĄáá˝ááşá áá˛áˇ information á áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
$ wc ./corpus2.1k.word
1000 40280 479353 ./corpus2.1k.word
Closed test áĄáá˝ááş evaluation result áá˝áąá áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
$ perl ./gradews.pl ./corpus2.1k ./corpus2.1k.word
Sent Accuracy: 32.00% (320/1000)
Word Prec: 86.14% (34692/40275)
Word Rec: 90.24% (34692/38446)
F-meas: 88.14%
Bound Accuracy: 97.50% (141622/145257)
$ time python ./myword.py word ./corpus2.shuf.open-test ./corpus2.shuf.open-test.word
real 6m45.903s
user 6m45.519s
sys 0m0.316s
open test ááąááŹá á áŹááźáąáŹááşá¸ááą á áŻá áŻááąáŤááşá¸ 5,626 ááźáąáŹááşá¸áážáááźáŽá¸ááąáŹáˇ á áŹááŻáśá¸áĄááąáĄáá˝ááşá 135,810 (áá áşááááşá¸ ááŻáśá¸ááąáŹááşá¸ ááŤá¸ááąáŹááş ááťáąáŹáş) áážáááŤáááşá
$ wc ./corpus2.shuf.open-test
5626 135810 1775923 ./corpus2.shuf.open-test
$ wc ./corpus2.shuf.open-test.word
5626 144232 1784344 ./corpus2.shuf.open-test.word
input áááŻááşáá˛áˇ á áŹááźáąáŹááşá¸áááťááŻáˇááᯠáĽáááŹáĄááá˛áˇ ááźááşáˇáááŻááşáááŻáˇáĄáá˝ááş head command áá˛áˇ print ááŻááşááŹá¸ááŤáááşá
$ head ./corpus2.shuf.open-test
áááşáˇ
á፠á
ááşá¸á
áŹá¸ áááᯠá
ááşá¸á
áŹá¸ á፠á
áá°áˇ áá˛áˇ áĄááťááşáĄá
áŽá¸ ááąá¸ áááşáááşá¸ááťááş áážáŹ áᎠááᯠááŹáááş áááş ááźááˇáşááŹá¸ áá˛áˇ radiation level ááᯠáá˝áąáˇ á áᏠá፠áááááŻáśá¸ áĄááźáááş ááąáŹáˇ á ááŻááş á፠áá°á¸ á
áááŽá¸ááŽá¸ááŹá¸ ááááş áááş COVID - 19 ááźáąáŹááşáˇ áááş á ááąáŹááşáááŻááşá¸ ááźááŻááşáá˝á˛ áá˝ážáąáˇáááŻááşá¸ ááŹá¸ á áááş á
áááááşááźááşá
ááťá˝ááşááąáŹáş á á
áááşááŹá¸ á ááąáŹááşá¸ áá˛áˇ áááŻáˇ ááŹá¸
áááŻááş ááťááş áááŻáˇ áááŻááş ááą áᏠá ááŻááş áá°á¸ áá˝ áááşá¸ áĄááą áá˝áą áááşá¸ áĄá
áşá áá˝áą ááᯠáááŻááşá¸áá
áşááŤá¸ááŹá¸ áá˝áą á áááşá¸ ááąáŹáş
áááąá
Ꮰááᯠáááş ááąáŤáşáᎠá
á˝ááşááźáŻááş áá˛áˇ áááşáááşáá˝ááş ááťáŻáś áááşáĄá°ááťáąáŹááşá¸ áá˛áˇ á ááąáŹ ááááşá
Ꮰá
áŹá¸ ááąáŹáˇ áááş ááᯠáááş áááşá¸ áᎠáĄáááŻááşá¸ áᲠá
ááťá˝ááşááąáŹáş áááşáá°áˇ ááᯠáážáŹ áá˛áˇ áᏠáá˛
áĄáá°á¸ááźáŹá¸ááŻáśá¸ ááŹá¸ áá° á ááťááşááŻáśá¸ ááťáŹá¸ áááş á
myword segmentation tool á á áŹááŻáśá¸ááźááşááąá¸ááźáŽá¸ááąáŹáˇ áá˝ááşááŹáá˛áˇ oputput áááŻááşáá˛áˇ á áŹááźáąáŹááşá¸ áá áşááťááŻáˇáááŻáááşá¸ input ááŻááşáá˛áˇáá˛áˇáááŻááşáá˛áˇ áážááŻááşá¸áážááşááźáŽá¸ ááąáˇááŹáááŻááşáĄáąáŹááşáááŻáˇ head command ááŻáśá¸ááźáŽá¸ print ááŻááşááąá¸ááŹá¸ááŤáááşá
$ head ./corpus2.shuf.open-test.word
áááşáˇ
á፠á
ááşá¸á
áŹá¸ áááᯠá
ááşá¸á
áŹá¸ á፠á
áá°áˇ áá˛áˇ áĄááťááşáĄá
áŽá¸ ááąá¸ áááşáááşá¸ááťááş áážáŹ áᎠááᯠááŹáááş áááş ááźááˇáşááŹá¸ áá˛áˇ radiation level ááᯠáá˝áąáˇ á áᏠá፠áááááŻáśá¸ áĄááźáááş ááąáŹáˇ á ááŻááş á፠áá°á¸ á
áááŽá¸ááŽá¸ááŹá¸ááááş áááş COVID-19 ááźáąáŹááşáˇ áááş á ááąáŹááşáááŻááşá¸ ááźááŻááşáá˝á˛ áá˝ážáąáˇáááŻááşá¸ ááŹá¸ á áááş á
áááááşááźááşá
ááťá˝ááşááąáŹáş á á
áááş ááŹá¸ á ááąáŹááşá¸ áá˛áˇ áááŻáˇ ááŹá¸
áááŻááş ááťááş áááŻáˇ áááŻááş ááą áᏠá ááŻááş áá°á¸ áá˝ áááşá¸ áĄááą áá˝áą áááşá¸ áĄá
áşá áá˝áą ááᯠáááŻááşá¸ áá
áş ááŤá¸ ááŹá¸ áá˝áą á áááşá¸ ááąáŹáş
á ááą á
Ꮰááᯠáááş ááąáŤáşáᎠá
á˝ááşááźáŻááş áá˛áˇ áááşáááşáá˝ááş ááťáŻáś áááşáĄá°ááťáąáŹááşá¸ áá˛áˇ á ááąáŹ ááááşá
Ꮰá
áŹá¸ ááąáŹáˇ áááş ááᯠáááş áááşá¸ áᎠáĄáááŻááşá¸ áᲠá
ááťá˝ááşááąáŹáş áááş áá°áˇ ááᯠáážáŹ áá˛áˇ áᏠáá˛
áĄáá°á¸ááźáŹá¸ááŻáśá¸ ááŹá¸ áá° á ááťááşááŻáśá¸ ááťáŹá¸ áááş á
Open test áĄáá˝ááş evaluation result áá˝áąá áĄáąáŹááşááŤáĄáááŻááşá¸ááŤá
$ perl ./gradews.pl ./corpus2.shuf.open-test ./corpus2.shuf.open-test.word
Sent Accuracy: 33.99% (1912/5626)
Word Prec: 85.52% (123295/144179)
Word Rec: 90.81% (123295/135773)
F-meas: 88.08%
Bound Accuracy: 97.60% (531488/544530)
áĄáááşáážáŹ syllable, word, phrase segmentation áá˝áąáá˛áˇ áááşáááşááźáŽá¸ áĄááąá¸á áááş áážááşá¸ááźáá˛áˇááźáŽá¸ááŹá¸ ááźá áşááąáá˛áˇ advanced user áá˝áąá ááŻáśá¸áá°á¸ááźáŽá¸ááŹá¸áá°áá˝áąá ááŻááşááááş ááąáŹááşááŻáśá¸áá˛áˇáĄááŤáážáŹ áĄáááşááźáąáááŻááşá áąáááŻáˇáĄáá˝ááş output áá˝áą ááźááąá¸áááąááąáŹáˇáᲠrun ááááşáˇ command áá˝áąáááŻáᲠááŽááąááŹááž á áŻááźáŽá¸ááťááąá¸ááąá¸ááŹá¸ááŤáááşá
Syllable segmentation
Syllable segmentation áá˛áˇ áááŻááşáá˛áˇ command ááťáŹá¸
- $ python myword.py syllable -h
- $ python myword.py syllable one_line.txt one_line.syllable
- $ python myword.py syllable -d "|" one_line.txt one_line.syllable
Word segmentation
Word segmentation áá˛áˇ áááŻááşáá˛áˇ command ááťáŹá¸
- $ python myword.py word -h
- $ python myword.py word one_line.txt one_line.word
- $ python myword.py word -d "|" one_line.txt one_line.word
- $ python myword.py word --unigram_word_bin ./dict_ver1/unigram-word.bin --bigram_word_bin ./dict_ver1/bigram-word.bin -d "/" one_line.txt one_line.word
Phrase segmentation
Phrase segmentation áĄááŻááşáá˛áˇ áááŻááşáá˛áˇ command ááťáŹá¸
- $ python ./myword.py phrase -h
- $ python ./myword.py phrase ./one_line.txt ./one_line.phrase
- $ python ./myword.py phrase --unigram_phrase_bin ./dict_ver1/unigram-phrase.bin --bigram_phrase_bin ./dict_ver1/bigram-phrase.bin ./one_line.txt ./one_line.phrase
ngram dictionary building for word segmentation
áááŻááşáˇáážáŹ áážááá˛áˇ corpus áá˛áˇ ngram áĄááááŹááşáá˝áą ááąáŹááşááźáŽá¸ word segmentation ááŻááşáááşáˇ áá°ááťáŹá¸áĄáá˝ááş
- $ python myword.py build_dict -h
- $ python ./myword.py build_dict ./corpus2.1k
- $ python ./myword.py build_dict --unigram_word_txt ./unigram-word.txt --bigram_word_txt ./bigram-word.txt --unigram_word_bin ./unigram-word.bin --bigram_word_bin ./bigram-word.bin ./corpus2.1k
training for phrase segmentation
áááŻááşáˇááąááŹáá˛áˇ áááŻááş manual word segmentation ááŻááşááŹá¸áá˛áˇ corpus ááŻáśá¸ááźáŽá¸ááąáŹáˇ ngram áĄááááŹááşáá˝áąááąáŹááşáááşá phrase áá˝áąááᯠáá˝á˛ááŻááşááźááşáˇááťááşáá˛áˇ áá°ááťáŹá¸áĄáá˝ááş
- $ python myword.py train_phrase -h
- $ python ./myword.py train_phrase -l 2 -t 0.1 -f 3 --unigram_phrase_txt unigram.l2.t0.1f3.txt --bigram_phrase_txt bigram.l2.t0.1f3.txt --unigram_phrase_bin unigram.l2.t0.1f3.bin --bigram_phrase_bin bigram.l2.t0.1f3.bin ./corpus.txt ./corpus.l2t0.1f3.phrase
- $ python ./myword.py train_phrase -l 2 -t 0.1 -f 2 ./corpus2.1k ./corpus2.1k.l2t0.1f2.phrase
Unsupervised segmentation experiment with NPMI
áááŻááşáááşáá˛áážáŹ áážááá˛áˇ Corpus áá áşááŻááŻááᯠááŻáśá¸ááźáŽá¸ááąáŹáˇ NPMI training, x-unit segmentation áá˛áˇ áááşáááşáá˛áˇ experiment áá˝áąááᯠááŻááşááźááşáˇááťááşáá˛áˇ áá°ááťáŹá¸áĄáá˝ááş
- $ python myword.py npmi_train -h
- $ python ./myword.py npmi_train -lr "1,2" -tr "0.1,0.1" -fr "2,3" ./mama_wawa_poem.txt
myWord Corpus ááᯠááąááąááťáŹááťáŹ develop ááŻááşááźá áşáá˛áˇááŹáááąáŹáˇ áĄáááşá¸ááŻáśá¸ ááážá áşááąáŹááş áážáááąááŤááźáŽá á áŹááźáąáŹááşá¸áá˝áąá ááťá˝ááşááąáŹáşáááŻááşáááŻááş BBC, VOA á á áŻááąáŹááşá¸ááŹá¸áá˛áˇáá˛áˇ ááááşá¸ááąáŹááşá¸ááŤá¸áá˝áąá ááťáąáŹááşá¸ááŹá¸áááťááŻáˇáá˛áˇ áĄáá°ááŻááşáá˛áˇáá˛áˇ NLP project áá˝áąáĄáá˝ááş ááźááşáááşáá˛áˇááźáá˛áˇ ááźááşááŹá Ꮰá áŹááźáąáŹááşá¸áá˝áąá 2019 ááŻááşá¸á UTYCC áážáŹ áááşááźáŹá¸áá˛áˇáá˛áˇ NLP class á ááťáąáŹááşá¸ááŹá¸áá˝áąáá˛áˇ NLP Lab., UTYCC á member áá˝áąááᯠmanual word segmentation áĄáá˝áąáˇáĄááźáŻáśááĄáąáŹááş áá áşááąáŹááşááᯠá áŹááźáąáŹááşá¸ááą áá áşááąáŹááşá ᎠáážáŹáá˝áą ááźááşáááŻááşá¸áá˛áˇááŹáá˝áą... á áááşááźááşáˇ áĄááťááŻá¸ááťááŻá¸áááŻáˇáááŻáˇ áááŻááááşá¸ áĄááąáá˛áˇá general domain ááŤáá˛á myWord Word Segmentation Corpus áĄáá˝ááş áá°ááŽáá˛áˇáá˛áˇáá°áĄáŹá¸ááŻáśá¸ááᯠááťáąá¸áá°á¸áááşááźáąáŹááşá¸ ááŽááąááŹáááą ááźáąáŹááźáŹá¸áááŻááŤáááşá ááŹáááşááąáŹááşá áááŻááşáá˛áˇ affiliation áá˝áąá áá°ááŽáá˛áˇáá˛áˇáĄááťáááşááŻááşá¸á áážáááąáá˛áˇ affiliation áá˝áąááŤá áážááşáááááąáŹááş ááŹáááşáá˝áąááᯠáĄáąáŹááşááŤáĄáááŻááşá¸ áĄáášáááŹáĄá áŽáĄá ááşáá˛áˇ ááťááąá¸ááźáŽá¸ áážááşáááşá¸áááşááąá¸áááŻááşááŤáááşá ááááşáááŻáˇ áá°ááŽáá˛áˇááźáŽá¸ááąáŹáˇ ááąáŹáşááźáááŻáˇááťááşáá áşáá˛áˇáá˛áˇ ááŹáááşáá˝áąáážááááşáááşá¸ áá˝ááşáˇáá˝ážááşááąá¸ááźááŤá corpus áá˛á ááąááŹáá˝áąááᯠááźááşá á áşáááşá¸ ááŹáááşáááŻá¸áááŻáˇáááŻáĄááşáááşáááşá¸ áááşáááŻá¸áá˝áŹá¸ááŤáááşá
đş ááťáąáŹáˇááąáááŻááş (UTYCC, Myanmar) | đť ááąáŹááşá¸áááşá áś (NLP Lab., UTYCC, Myanmar) | đšáááşáááˇáşáááˇáşáážááŻááş (NLP Lab., UTYCC, Myanmar) |
đą áááşááŤááŤáááŻááş (CSU, China) | đź áááˇáşáááˇáşáááşá¸áááˇáş (UTYCC, Myanmar) | đ¸ ááťááŻáááşáŚá¸ (UTYCC, Myanmar) |
đ ááťááŻá፠(UTYCC, Myanmar) | đˇ áááŻááşááŻááą (UTYCC, Myanmar) | đ áááŻááşááŹáá˝ááş (UTYCC, Myanmar) |
đş áá˝ááşáážááŻááşáááŻá¸ (UTYCC, Myanmar) | đť ááŹááŹáážááŻááş (KMITL, Thailand) | đšáááşááááŹáŚá¸ (NLP Lab., UTYCC, Myanmar) |
đą áááşá¸ááŻáážááŻááş (UTYCC, Myanmar) | đź áááşá¸áá˝ážáąá ááşáá°á¸ (NLP Lab., UTYCC, Myanmar) | đ¸ áááşá¸áĄááášááźáąááťáąáŹáş (UTYCC, Myanmar) |
đ áážááşá¸ááŻáážááŻááş (UTYCC, Myanmar) | đˇ áážááşá¸áĄááĄáááťáᯠ(UTYCC, Myanmar) | đ áážááşá¸áĄáąá¸áááşáˇ (UTYCC, Myanmar) |
đş ááąáŹáşáĄááşáá°á¸áĄáąá¸ (YEC4Blind, Myanmar) | đť áááŻáášáᏠ(UTYCC, Myanmar) | đš ááźááŻá¸áá°áááş (NLP Lab., UTYCC, Myanmar) |
đą ááźááŻá¸ááąááŹááą (UTYCC, Myanmar) | đź ááźá°á ááşááąá¸ (NLP Lab., UTYCC, Myanmar) | đ¸ ááťááŻá¸ááŹáááşá¸ (UTYCC, Myanmar) |
đ ááźááˇáşááźááˇáşááąá¸ (UTYCC, Myanmar) | đˇ ááźááşááźáááşá¸ááťááşá¸ (UTYCC, Myanmar) | đ ááźáĄáá áś (SIIT, Thailand) |
đş áážáŻáśááśááŹááťáąáŹáş (NLP Lab., UTYCC, Myanmar) | đť ááąáááşáá˝ááşá¸ (NLP Lab., UTYCC, Myanmar) | đš ááąááźááŻá¸áĄáąáŹááş (UTYCC, Myanmar) |
đą ááąááźá°áááş (UTYCC, Myanmar) | đź ááąááźááşááźááşáááŻááş (UTYCC, Myanmar) | đ¸ áá˛ááťáąáŹáşááááşá¸ (LU Lab., Myanmar) |
đ áážáážááąá¸ (UCSY, Myanmar) | đˇ áážáá áşááą (NLP Lab., UTYCC, Myanmar) | đ áážááŻááşááąáááş (UTYCC, Myanmar) |
đş áááşáˇááááşášáᎠ(YTU, Myanmar) | đť áááşá¸áá°ááŹááťáąáŹáş (Waseda Univ., Japan) | đš ááąáážááşá¸áĄááášááźáŹááąáŹááş (UTYCC, Myanmar) |
đą ááááşááźááşáˇáĽáŽá¸ (UCSY, Myanmar) | đź ááŽááŹá ááşá¸ (UTYCC, Myanmar) | đ¸ ááąááŹááşáá˝ááşá¸ (UTYCC, Myanmar) |
đ ááąááŹááźááŻá¸ (NLP Lab., UTYCC, Myanmar) | đˇ áĄáááźá°ááźá°áá˝ááş (UTYCC, Myanmar) | đ áĄáááášááŹááźá° (UTYCC, Myanmar) |
đş áĄáąá¸ááźááşááąáŹáşááŹáŚá¸ (NLP Lab., UTYCC, Myanmar) | đť áĽáášááŹáá˝ááşá¸ (Nagaoka Univ., Japan) |
đ áážááŻááşááźááşáá˝ááş (NLP Lab., UTYCC, Myanmar) the highest contribution for myWord Corpus (Version 1.0) developing
đ Ye Kyaw Thu (Visiting Professor, LST, NECTEC, Thailand)
- writing brief English README file
- adding sub_word unit for NMT
- upload Word Segmentation Guideline for Burmese (Myanmar language)
- automatic spelling checking running on myWord corpus
- adding Beam decoding
- evaluation tool for segmentation?!
- dealing punctuation characters
- -z, --compress (enable compression of output e.g. zlib)
- -s, --split (Split segmented output file into small blocks)
- plan to support input with "folder" and "stdin"
myWord is MIT-licensed. The license applies to the pre-built unigram, bigram dictionaries as well.
Currently, please cite as:
myWord: Syllable, Word and Phrase Segmenter for Burmese, Ye Kyaw Thu, Sept 2021, GitHub Link: https://github.com/ye-kyaw-thu/myWord
- Viterbi, Andrew. Error bounds for convolutional codes and an asymptotically optimum decoding algorithm. IEEE transactions on Information Theory, 13(2):260â269, 1967 [Paper]
- Slade, George. (2013). The Viterbi algorithm demystified. Link:https://www.researchgate.net/publication/235958269_The_Viterbi_algorithm_demystified
- The Viterbi Algorithm Demystified, By Andrew J. Viterbi, March 16, 2017, Link: https://viterbischool.usc.edu/news/2017/03/viterbi-algorithm-demystified/
- Forney, G David. The Viterbi algorithm. Proceedings of the IEEE, 61(3):268â278, 1973, https://www2.isye.gatech.edu/~yxie77/ece587/viterbi_algorithm.pdf
- The Viterbi Algorithm at 50: https://viterbischool.usc.edu/news/2017/03/viterbi-algorithm-50/
- Backurs, A. & Tzamos, C.. (2017). Improving Viterbi is Hard: Better Runtimes Imply Faster Clique Algorithms. Proceedings of the 34th International Conference on Machine Learning, in Proceedings of Machine Learning Research, 70:311-321 http://proceedings.mlr.press/v70/backurs17a/backurs17a.pdf
- Python implementation of Viterbi algorithm for word segmentation A clean-up of this: (http://norvig.com/ngrams/ch14.pdf), https://gist.github.com/markdtw/e2a4e2ee7cef8ea6aed33bb47a97fba6
- Python Word Segmentation: https://github.com/grantjenks/python-wordsegment
- Beautiful Data, The Stories Behind Elegant Data Solutions, Toby Segaran, Jeff Hammerbacher, O'Reilly, 2009, Link: https://github.com/jhulick/bookstuff/blob/master/Oreilly%20-%20Beautiful%20Data.pdf
- Viterbi Algorithm for HMM Decoding, Link:https://www.cl.cam.ac.uk/teaching/1718/MLRD/slides/slides9.pdf
- Implement Viterbi Algorithm in Hidden Markov Model using Python and R Link: http://www.adeveloperdiary.com/data-science/machine-learning/implement-viterbi-algorithm-in-hidden-markov-model-using-python-and-r/
- Yining Wang, Long Zhou, Jiajun Zhang and Chengqing Zong, Word, Subword or Character? An Empirical Study of Granularity in Chinese-English NMT, CoRR, abs/1711.04457, 2017. [Paper]
- Evaluation perl script for word segmentation: https://raw.githubusercontent.com/neubig/nlptutorial/master/script/gradews.pl
- Experiment Note by Assoc. Prof. Daichi Mochihashi: http://chasen.org/~daiti-m/diary/
- Statistically recognize long phrases with Normalized PMI: http://chasen.org/~daiti-m/diary/misc/phraser.py
- Vector Semantics: https://courses.engr.illinois.edu/cs440/fa2018/lectures/lect36.html
- Lecture 17: Vector-space semantics (distributional similarities), Julia Hockenmaier: https://courses.engr.illinois.edu/cs447/fa2018/Slides/Lecture17HO.pdf
- Pointwise_mutual_information: https://en.wikipedia.org/wiki/Pointwise_mutual_information
- Dr. Thein Tun, Acoustic Phonetics and The Phonology of the Myanmar Language
- Romanization: https://en.wikipedia.org/wiki/Romanization
- Myanmar Unicode: http://unicode.org/charts/PDF/U1000.pdf
- Syllable segmentation algorithm of Myanmar text: http://gii2.nagaokaut.ac.jp/gii/media/share/20080901-ZMM%20Presentation.pdf
- Zin Maung Maung and Yoshiki Makami,"A rule-based syllable segmentation of Myanmar Text", in Proceeding of the IJCNLP-08 workshop of NLP for Less Privileged Language, January, 2008, Hyderabad, India, pp. 51-58. Paper
- Tin Htay Hlaing, "Manually constructed context-free grammar for Myanmar syllable structure", in Proceedings of the Student Research Workshop at the 13th Conference of the European Chapter of the Association for Computational Linguistics (EACL '12), Association for Computational Linguistics, Stroudsburg, PA, USA, pp. 32-37. Paper
- Ye Kyaw Thu, Andrew Finch, Yoshinori Sagisaka and Eiichiro Sumita, "A Study of Myanmar Word Segmentation Schemes for Statistical Machine Translation", in Proceedings of the 11th International Conference on Computer Applications (ICCA 2013), February 26~27, 2013, Yangon, Myanmar, pp. 167-179. Paper
- Ye Kyaw Thu, Andrew Finch, Win Pa Pa, and Eiichiro Sumita, "A Large-scale Study of Statistical Machine Translation Methods for Myanmar Language", in Proceedings of SNLP2016, February 10-12, 2016, Phranakhon Si Ayutthaya, Thailand. Paper
- Regular Expression: https://en.wikipedia.org/wiki/Regular_expression
- DebuggexBeter: https://www.debuggex.com/
- Chenchen Ding, Ye Kyaw Thu, Masao Utiyama, Eiichiro Sumita: Word Segmentation for Burmese (Myanmar). ACM Trans. Asian Low Resour. Lang. Inf. Process. 15(4): 22:1-22:10 (2016)
- Shaoning Zhang and Cunli Mao and Zhengtao Yu and Hongbin Wang and Z. Li and Jiafu Zhang, Word Segmentation for Burmese Based on Dual-Layer CRFs, ACM Transactions on Asian and Low-Resource Language Information Processing (TALLIP), Volume 18, 2019, pp. 1-11
- Burmese word segmentation program using Foma-generated Finite State Automata, Link: https://github.com/lwinmoe/segment