Share
Embed
Transcript
41 slides
-
Who am I ଧాஐࢠ @moco_beta ݩɿWebαʔϏεاۀͰPythonΤϯδχΞΛ͍ͯ͠·ͨ͠ ݱࡏɿݕࡧΤϯδϯ Solr, Elasticsearch ಋೖࢧԉɺӡ༻αϙʔτΛ͍ͯ͠·͢
ʢגʣϩϯΠοτॴଐ ීஈओʹJavaͱ͖Ͳ͖Scala͞ΜɻPython ͷ͓ࣄ͖ͨΒ͍͍ͳ :-) ڵຯ͕͋Δ͜ͱɿใݕࡧͱɺͦͷؔ࿈ٕज़ ࣗવݴޠॲཧɾػցֶशɹϫφϏʔΊͯ͟͠ษڧத 🐥 2 -
Janome ͱ http://mocobeta.github.io/janome/ “janome (ऄͷ) , Pure Python Ͱॻ͔Εͨ, ࣙॻแͷܗଶૉղੳثͰ͢.”
(venv) $ pip install janome (venv) $ python >>> from janome.tokenizer import Tokenizer >>> t = Tokenizer() >>> for token in t.tokenize("͢ͷ͏ͪ"): … print(token) … ͢ ໊ࢺ,Ұൠ,*,*,*,*,͢,εϞϞ,εϞϞ ॿࢺ,ॿࢺ,*,*,*,*,,Ϟ,Ϟ ໊ࢺ,Ұൠ,*,*,*,*,,ϞϞ,ϞϞ ॿࢺ,ॿࢺ,*,*,*,*,,Ϟ,Ϟ ໊ࢺ,Ұൠ,*,*,*,*,,ϞϞ,ϞϞ ͷ ॿࢺ,࿈ମԽ,*,*,*,*,ͷ,ϊ,ϊ ͏ͪ ໊ࢺ,ඇཱࣗ,෭ࢺՄೳ,*,*,*,͏ͪ,ν,ν 4 -
ಛͱ͔ ࣙॻɺݴޠϞσϧ mecab-ipadic-2.7.0-20070801 Λ༻ ͍͍ͩͨ MeCab ͱಉ͡ղੳ݁ՌʹͳΓ·͢ɻະޠॲཧͰࠩ ҟ͕Ͱ·͢ Pure Python
͔ͭඪ४ϥΠϒϥϦͷΈ༻ ڥΘͣͲ͜Ͱಈ͘…ͣ Ϣʔβʔࣙॻαϙʔτ (MeCab ࣙॻϑΥʔϚοτ) ୯ޠՃ͕ࢼͤ·͢ 5 -
͢ / / / / /
ͷ / ͏ͪ Janome Λࢧ͑ΔΞϧΰϦζϜ ໊ࢺ ໊ࢺ ໊ࢺ ॿࢺ ॿࢺ ॿࢺ ໊ࢺ ඞཁͳࣝ • ޠኮɿʮ͢ʯʮʯͱ͍͏໊ࢺɺʮʯʮͷʯͱ͍͏ॿࢺ • ʢࣙॻʣ • ຊޠΒ͠͞ɿ໊ࢺͷ͋ͱʹॿࢺ͕͖͍͢ • ʢݴޠϞσϧʣ -
ࣙॻҾ͖ ࣙॻɺαΠζ͕ίϯύΫτͰߴʹҾ͚Δ͜ͱ͕ඞཁ ϋογϡϚοϓ (Python ͷ dict) Ͱ͍͍͚Ͳɺ ίϞϯϓϨϑΟοΫεϚονΛ͏ͱࣙॻҾ͖ͷճ͕ݮΔͷͰޮత ͘͞Β ࣙॻ
͞ɹಈࢺʮ͢Δʯͷ׆༻ܗ ͘͞ɹಈࢺʮ͘͞ʯͷجຊܗ ͘͞ɹܗ༰ࢺʮ͍͘͞ʯͷ׆༻ܗ ͘͞Βɹ໊ࢺ … ଞ 11 ୯ޠ ೖྗ ग़ྗ -
ࣙॻҾ͖ σʔλߏɾΞϧΰϦζϜ ύτϦγΞ (JUMAN) μϒϧྻ (ChaSen, MeCab) FST (Kuromoji/Lucene൛, Janome)
http://taku910.github.io/mecab/ http://www.slideshare.net/lucenerevolution/automaton-invasionlucenerevolution2012 13 -
FST ? Finite State Transducers (ܾఆੑ༗ݶΦʔτϚτϯͷҰछ) ਖ਼֬ʹ Minimal Acyclic Subsequential
Transducers ೖྗͷϓϨϑΟοΫεɾαϑΟοΫε྆ํΛڞ༗͢Δͷ ͰɺτϥΠͱൺֱͯ͠ίϯύΫτ (จ) http://citeseerx.ist.psu.edu/viewdoc/summary? doi=10.1.1.24.3698 14 -
ਤղFST খ͞ͳࣙॻΤϯτϦ { ‘apr’: ’30’, ‘aug’: ’31’, ‘dec’: ’31’,
‘feb’: [’28’, ’29’], ‘jan,’: ’31’, ‘jul’: ’31’, ‘jun’: ’30’ } ͱ͍͏, ̓ͭͷ ೖྗ => ग़ྗ ͷϖΞ͔ΒFSTΛ࡞Γ·͢ ೖྗܗଶૉͷจࣈྻʢදܗʣɺग़ྗϚον͢Δܗଶૉͷ IDͱࢥ͍ͬͯͩ͘͞ 16 -
ղੳ ʮ͢ͷ͏ͪʯʢ;ͨͨͼʣͷ۠Γํͨ͘͞Μ͋Δ 1.͢ / / / /
/ ͷ / ͏ͪ 2.͢ / / / / / ͷ / ͏ͪ 3.͢ / / / / / ͷ / ͏ͪ ͳͲͳͲ… ࣙॻΛҾ͖ͭͭɺ·ͣͯ͢ͷׂͷީิΛ্͑͛Δ ໊ࢺ ໊ࢺ ໊ࢺ ॿࢺ ॿࢺ ॿࢺ ໊ࢺ ໊ࢺ ॿࢺ ໊ࢺ ໊ࢺ ॿࢺ ॿࢺ ໊ࢺ ໊ࢺ ໊ࢺ ໊ࢺ ໊ࢺ ॿࢺ ॿࢺ ॿࢺ 24 -
ղੳ ީิͷͳ͔͔ΒɺҰ൪ຊޠΒ͍͠ύλʔϯΛબͿ 1. ͢ / / /
/ / ͷ / ͏ͪ 2. ͢ / / / / / ͷ / ͏ͪ ʮ2. ΑΓ1.ͷ΄͏͕ࣗવʯΛܭࢉͰٻΊΔʹʁ ໊ࢺ ໊ࢺ ໊ࢺ ॿࢺ ॿࢺ ॿࢺ ໊ࢺ ໊ࢺ ॿࢺ ໊ࢺ ໊ࢺ ॿࢺ ॿࢺ ໊ࢺ 25 -
Janome ։ൃ;Γ͔͑Γ ͨ·ʹɺͲͷ͘Β͍ͷظؒͰ։ൃͨ͠ͷ͔ฉ͍ͯͩ͘͞Δํ͕͍ΔͷͰɺGithub Ϧϙ δτϦ (https://github.com/mocobeta/janome) ͷίϛοτཤྺΛͬͯΈͨ 2015/1/20 ࠒ: ४උ
(FSTͷจ, LuceneͷιʔεಡΈ࢝Ίͨ) 2015/2/14 ࠒ: FSTͷϕʔεΛ࡞Γ࢝ΊΔ 2015/3/14 ࠒ: γεςϜࣙॻ (mecab-ipadic) Λ࡞Γ࢝ΊΔ 2015/4/1 ࠒ: ϥςΟεΛ࡞Γ࢝ΊΔ 2015/4/7: Ϣʔβʔࣙॻ͕ͭ͘ 2015/4/8: PyPI ʹొɺެ։ ։ൃ͜Μͳײ͡ FSTͷཧղͱ࣮ʹ2ϲ݄ mecab-ipadic ͷแࣙॻԽʹ0.5ϲ݄ ϏλϏͷ࣮ʹ ϦϦʔε࡞ۀʹ1 pythonεΩϧॳʙதڃ͘Β͍ -
։ൃͷ͖͔͚ͬ Q: ͱ͜ΖͰͳΜͰ࡞Ζ͏ͱ ࢥͬͨͷ A: ܗଶૉղੳثͷ࣮ࣗવ ݴޠॲཧͷ 101 Ͱ͢ ^^
(by @ikawaha) (kuromoji.js ࡞ऀ) (kagome ࡞ऀ) ͔ͯ͠͠: ྲྀߦͬͯΔ…?(ҧ) -
FST & แγεςϜࣙॻͷ࣮ ͕͜͜Ͱ͖ΕऴͬͨΑ͏ͳͷʂ ʢͨͿΜʣ FSTʢΦʔτϚτϯʣʮลͷू· ΓʯͱΈͯόΠτྻʹམͱ͜͠Ή (Apache Lucene ํࣜ)
string encode(), decode() Ͱ bytes ʹύοΫ int struct.pack(), unpack() Ͱ bytes ʹύοΫ http://mocobeta-backup.tumblr.com/post/113693778372/lucene-fst-2 janome ͰͷΤϯίʔυྫ -
ࣙॻαΠζ ॳظϦϦʔε࣌ 20MB 0.2 ܥͰগ͠খ͘͞ͳͬͯ 13MB TODO: Πϯετʔϧͷͱ͖ʹɺιʔεຒΊࠐΈͷࣙॻΛϓϦίϯύΠϧ ͢Δͱ͜ΖͰϝϞϦ3-4GBඞཁ ͱΓ͍͔͋͑ͣͭ͘ࢼͨ͠ΓํͷதͰҰ൪͔ͬͨΜͩ…
ࣗͷVPSڥ(2GB)Ͱಈ͔ͳ͍ͷʹؾ͍ͮͨͷͰͳΜͱ͔͠·͢ orz 32 -
ϓϩϑΝΠϧΛͱ͍ͬͯͱ͜ΖΛಛఆͯ͠ɺ׳Εͳ͍ͳΓʹࢼߦࡨޡͯ͠ΈΔ ʢ͍ͱ͜Ζ̍ʣࣙॻҾ͖ʢFSTͷݕࡧʣ͕࣮ߦ࣌ؒͷΛΊΔ ΩϟογϡΛೖΕͨΓ ʢ͜͜FSTͷ࣮͕͍·͍͔ͪͩΒ͔ͳʣ ΦϒδΣΫτੜΛΊ͍ͯΖ͍Ζ Tuple ʹͨ͠Γ ʢ͍ͱ͜Ζ̎ʣ࿈ίετݕࡧ͕࣮ߦ࣌ؒͷ 1/4 ΛΊΔ
࿈ίετͷ࣋ͪํΛɺ࠷ॳ dict (ϋογϡςʔϒϧ) ͩͬͨͷΛɺʢMeCabʹͳΒ͍ʣೋ࣍ݩྻʹ ม͑Δͱߴʹɻσʔλߏͱͬͯେࣄ ^^; ʢ͍ͱ͜Ζ̏ʣϥςΟεͷϊʔυੜ͕࣮ߦ࣌ؒͷ 1/4 ΛΊΔ (͋ͱϝϞϦ৯͏) TODO νϡʔχϯά 33 -
MeCab (C++) ͷΫϩʔϯɺ·ͨMeCabࣙॻ(Ϟσϧ)Λआ༻͠ ͍ͯΔܗଶૉղੳث͋Ε͜Ε Igo (Java), igo-python (Python), igo-ruby (Ruby),
igo-javascript (JavaScript) Kuromoji (Java), kuromoji.js (JavaScript) kagome (Go), janome (Python) ଞ... Appendixɿྺ࢙ʹ͍ͭͯগ͚ͩ͠ 37