
Pythonã©ã€ãã©ãª(圢æ çŽ è§£æ)ïŒmecab
ïŒïŒæŠèŠ
ãMeCab㯠京éœå€§åŠæ å ±åŠç ç©¶ç§âNTTã³ãã¥ãã±ãŒã·ã§ã³ç§åŠåºç€ç ç©¶æ å ±åç ç©¶ãŠããããããžã§ã¯ããéããŠéçºããããªãŒãã³ãœãŒã¹ 圢æ çŽ è§£æïŒæãæå°ã®æå³åäœã§ãã圢æ çŽ ã«åè§£ããããšïŒãšã³ãžã³ã§ãã èšèª, èŸæž,ã³ãŒãã¹ã«äŸåããªãæ±çšçãªèšèšãåºæ¬æ¹éãšããŠããŸãããã©ã¡ãŒã¿ã®æšå®ã« Conditional Random Fields (CRF) ãçš ããŠãã, ChaSenãæ¡çšããŠãã é ããã«ã³ãã¢ãã«ã«æ¯ã¹æ§èœãåäžããŠããŸãããŸãå¹³åçã« ChaSen, Juman, KAKASIããé«éã«åäœããŸãã

ïŒïŒïŒïŒããã¹ãè§£æã®åºç€
ãããã¹ãè§£æã¯ãããã¹ãããŒã¿ããæçšãªæ
å ±ãæœåºããããããã¹ããçè§£ãããããããã®ææ³ã§ãã圢æ
çŽ è§£æã¯ãã®äžã€ã§ãæç« ãæå³ãæã€æå°åäœã§ãã圢æ
çŽ ã«åããããšã§ãããã¹ãã®æ§é ãçè§£ããããšãå¯èœã«ãªããŸãã
ãããã¹ãè§£æã®æŠèŠã¯ãããã¹ãè§£æ(ã¹ã©ã€ãã»æ±äº¬å€§åŠ)(CC-BY)ãããæç²ããŸãããåçš®çšèªã®èª¬æããããŸãã

ïŒïŒç°å¢æ§ç¯
ãmecabã®ç°å¢æ§ç¯ã¯mecab-python3ãšããPythonã©ãããŒãã€ã³ã¹ããŒã«ããŸããmecabæ¬äœãšã¯å¥ã«èŸæžãå¿ èŠãªããåãããŠ"unidic-lite"ãã€ã³ã¹ããŒã«ããŸãã
[Terminal]
pip install unidic-lite
pip install mecab-python3ïŒïŒåœ¢æ çŽ è§£æïŒTagger()
ãMeCabã䜿ã£ãŠåœ¢æ çŽ è§£æãè¡ãåºæ¬çãªæ¹æ³ã説æããŸãã
ïŒïŒïŒïŒåœ¢æ çŽ ã»åè©ç¢ºèª
ãæãåºæ¬çãªåœ¢æ çŽ è§£æã®æ¹æ³ã¯ãMeCabã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠãããã¹ãããŒã¿ãæž¡ãã ãã§ããå®è¡ãããšãããã¹ãã圢æ çŽ ã«åå²ãããå圢æ çŽ ã®åºæ¬åœ¢ãåè©ãèªã¿ãªã©ã衚瀺ãããŸããåºåãã©ãŒãããäžèЧã¯äžèšã®éãã§ãã
衚局圢
åè©
åè©çްåé¡1
åè©çްåé¡2
åè©çްåé¡3
掻çšå
掻çšåœ¢
å圢
èªã¿
çºé³
[IN]
import MeCab
tagger = MeCab.Tagger()
text = "ãããããããããã®ãã¡"
print(tagger.parse(text))[OUT]
ããã ã¹ã¢ã¢ ã¹ã¢ã¢ æ åè©-æ®éåè©-äžè¬ 0
ã 㢠㢠ã å©è©-ä¿å©è©
ãã ã¢ã¢ ã¢ã¢ æ¡ åè©-æ®éåè©-äžè¬ 0
ã 㢠㢠ã å©è©-ä¿å©è©
ãã ã¢ã¢ ã¢ã¢ æ¡ åè©-æ®éåè©-äžè¬ 0
ã® ã ã ã® å©è©-æ Œå©è©
ãã¡ ãŠã ãŠã å
åè©-æ®éåè©-å¯è©å¯èœ 0
EOSããªãparseãããåºåã¯printæã§åºåããæã«ç¶ºéºã«ãªãããã«ã¿ã(\t)ãæ¹è¡(\n)ãå«ãã æååã§ãããã£ãŠæ±ãã«é¢ããŠã¯Pythonã®ããã¹ãåŠçãå¯èœã§ãã
[IN]
print(type(tagger.parse(text)))
display(tagger.parse(text))
[OUT]
print(type(m.parse(text)))
'ããã\tã¹ã¢ã¢\tã¹ã¢ã¢\tæ\tåè©-æ®éåè©-äžè¬\t\t\t0\nã\tã¢\tã¢\tã\tå©è©-ä¿å©è©\t\t\t\nãã\tã¢ã¢\tã¢ã¢\tæ¡\tåè©-æ®éåè©-äžè¬\t\t\t0\nã\tã¢\tã¢\tã\tå©è©-ä¿å©è©\t\t\t\nãã\tã¢ã¢\tã¢ã¢\tæ¡\tåè©-æ®éåè©-äžè¬\t\t\t0\nã®\tã\tã\tã®\tå©è©-æ Œå©è©\t\t\t\nãã¡\tãŠã\tãŠã\tå
\tåè©-æ®éåè©-å¯è©å¯èœ\t\t\t0\nEOS\n'ïŒïŒïŒïŒãªãã·ã§ã³è¡šç€ºïŒ-O
ãâMeCab.Tagger()âã®åŒæ°ã«-o ãªãã·ã§ã³ãæå®ãããšè€æ°ã®åœ¢åŒã§åºåãåŸãããšãåºæ¥ãŸãã
ãïŒïŒïŒãŒïŒïŒåãã¡æžãã¢ãŒã(åèªã®ã¿æœåº)ïŒ-Owakati
ãåèªã ããæœåºãããå Žåã¯ãMeCabã®ã€ã³ã¹ã¿ã³ã¹ãäœæããéã«ãªãã·ã§ã³ãšããŠ"-Owakati"ãæå®ããŸãããªã"-O"ã¯outputã®ç¥ã§ããåºå圢åŒãèšå®ããŸãã
ãå®è¡ãããšããã¹ãã圢æ
çŽ ã«åå²ããã圢æ
çŽ ãã¹ããŒã¹ã§åºåãããŠè¡šç€ºãããŸãã
[IN]
tagger = MeCab.Tagger("-Owakati")
print(tagger.parse(text))[OUT]
ããã ã ãã ã ãã ã® ãã¡ ãïŒïŒïŒãŒïŒïŒå šæ å ±åºåïŒ-Odump
ãå šæ å ±ãåºåããå Žåã¯"Oyomi"ãæå®ããŸãã
[IN]
tagger = MeCab.Tagger("-Odump")
print(tagger.parse(text))[OUT]
0 BOS BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,* 0 0 0 0 0 0 2 1 0.000000 0.000000 0.000000 0
11 ããã åè©,æ®éåè©,äžè¬,*,*,*,ã¹ã¢ã¢,æ,ããã,ã¹ã¢ã¢,ããã,ã¹ã¢ã¢,å,*,*,*,*,ã¹ã¢ã¢,ã¹ã¢ã¢,ã¹ã¢ã¢,ã¹ã¢ã¢,*,*,0,C2,* 0 9 5142 5142 1 6 0 1 0.000000 0.000000 0.000000 10280
24 ã å©è©,ä¿å©è©,*,*,*,*,ã¢,ã,ã,ã¢,ã,ã¢,å,*,*,*,*,ã¢,ã¢,ã¢,ã¢,*,*,*,"åè©%F2@-1,圢容è©%F4@-2,åè©%F1",* 9 12 665 665 1 6 0 1 0.000000 0.000000 0.000000 12536
34 ãã åè©,æ®éåè©,äžè¬,*,*,*,ã¢ã¢,æ¡,ãã,ã¢ã¢,ãã,ã¢ã¢,å,*,*,*,*,ã¢ã¢,ã¢ã¢,ã¢ã¢,ã¢ã¢,*,*,0,C3,* 12 18 5142 5142 1 6 0 1 0.000000 0.000000 0.000000 21286
42 ã å©è©,ä¿å©è©,*,*,*,*,ã¢,ã,ã,ã¢,ã,ã¢,å,*,*,*,*,ã¢,ã¢,ã¢,ã¢,*,*,*,"åè©%F2@-1,圢容è©%F4@-2,åè©%F1",* 18 21 665 665 1 6 0 1 0.000000 0.000000 0.000000 23542
52 ãã åè©,æ®éåè©,äžè¬,*,*,*,ã¢ã¢,æ¡,ãã,ã¢ã¢,ãã,ã¢ã¢,å,*,*,*,*,ã¢ã¢,ã¢ã¢,ã¢ã¢,ã¢ã¢,*,*,0,C3,* 21 27 5142 5142 1 6 0 1 0.000000 0.000000 0.000000 32292
62 ã® å©è©,æ Œå©è©,*,*,*,*,ã,ã®,ã®,ã,ã®,ã,å,*,*,*,*,ã,ã,ã,ã,*,*,*,åè©%F1,* 27 30 802 802 1 6 0 1 0.000000 0.000000 0.000000 33019
78 ãã¡ åè©,æ®éåè©,å¯è©å¯èœ,*,*,*,ãŠã,å
,ãã¡,ãŠã,ãã¡,ãŠã,å,*,*,*,*,ãŠã,ãŠã,ãŠã,ãŠã,*,*,0,C3,* 30 36 5148 5148 1 6 0 1 0.000000 0.000000 0.000000 35080
86 EOS BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,* 36 36 0 0 0 0 3 1 0.000000 0.000000 0.000000 34986ãïŒïŒïŒãŒïŒïŒChasen圢åŒïŒ-Ochasen
ãChasen圢åŒïŒæ¥æ¬èªåœ¢æ çŽ è§£æããŒã«ã®äžã€ã§ãããChaSenããåºåãã圢åŒïŒã§åºåããå Žåã¯äžèšã®éãã§ãããã ãç§ã®PCã§ã¯ãšã©ãŒãåºãŠããåå äžæã§ãããåè¿°ã®ç°å¢æ§ç¯ã«ïŒÎ±ã§è¿œå åŠçãå¿ èŠãããããŸããã
[IN]
tagger = MeCab.Tagger("-Ochasen")
print(tagger.parse(text))[OUT]
ãšã©ãŒäžãïŒïŒïŒãŒïŒïŒãšãä»äžïŒ-Oyomi
ãã«ã¿ã«ã¿åœ¢åŒã§åºåããå Žåã¯"Oyomi"ãæå®ããŸãããã ãç§ã®PCã§ã¯ãšã©ãŒãåºãŠããåå äžæã§ãããåè¿°ã®ç°å¢æ§ç¯ã«ïŒÎ±ã§è¿œå åŠçãå¿ èŠãããããŸããã
[IN]
tagger = MeCab.Tagger("-Oyomi")
print(tagger.parse(text))[OUT]
ãšã©ãŒäžïŒïŒïŒïŒãµã³ãã«ã³ãŒã
ãããã¹ããè€æ°çšæããŠã©ã®ããã«åœ¢æ çŽ è§£æãããã確èªããŸãããå šéšã²ãããªã ãšç²ŸåºŠãäœãã§ãããæŒ¢åãåãããæç« ã§ã¯æ¯èŒçããçµæãåŸãããŸããã
[IN]
import MeCab
import pandas as pd
texts = [] #æç« ãæ ŒçŽãããªã¹ã
texts.append('赀巻çŽéå·»çŽé»å·»çŽ')
texts.append('ãããŸããã¿ãããŸããã¿ããŸããã¿')
texts.append('ã«ãšã«ãŽãããŽããäžãŽãããŽããããããŠãŽãããŽããå
ãŽãããŽãã')
texts.append('ããããŽãããŽããã¿ãŽãããŽããããããŠãŽãããŽããããŽãããŽãã')
texts.append('骚ç²é¬ç蚎èšå蚎')
texts.append('ãã€ããããããããããããããã')
texts.append('æ°äººæææ°æ¥ã·ã£ã³ãœã³ã·ã§ãŒ')
texts.append('ããããããã
ãããã
ãããããããããŒ')
texts.append('ã¹ã¢ã¢ãæ¡ãæ¡ã®ãã¡ãæ¡ãã¹ã¢ã¢ãããã®ãã¡')
texts.append('ãããããããããã®ãã¡ããããããããããã®ãã¡')
texts.append('æ±äº¬ç¹èš±èš±å¯å±é·ä»æ¥æ¥éœäŒæèš±å¯æåŠ')
texts.append('ãšãããããšã£ããããããããã¡ããããããã
ããããã
ãããããããã²')
texts.append('é£ã®å®¢ã¯ããæ¿é£ã客ã ')
texts.append('ãšãªãã®ãããã¯ãããããããããã ')
texts.append('ç麊çç±³çåµ')
texts.append('ãªãŸãããªãŸãããªãŸããŸã')
texts.append('ã«ãã®åºã«ã¯äºçŸœã®é¶ã¯é°ãé£ã¹ã')
texts.append('ã«ãã®ã«ãã«ã¯ã«ãã®ã«ããšãã¯ãã«ããã¹ã')
texts.append('åºã«ã¯é¶ãäºçŸœããŸãã')
texts.append('ã«ãã«ã¯ã«ããšããã«ãããŸãã')
texts.append('åäž»ãå±é¢šã«äžæã«åäž»ã®çµµãæãã')
texts.append('ãŒãããã³ããã¶ã«ããããã«ãŒããã®ããããã')
outputs = [] #åºåãããªã¹ã
m = MeCab.Tagger("-Owakati")
for text in texts:
outputs.append(m.parse(text))
pd.DataFrame(outputs).to_excel('outputs_mecab.xlsx',
index=False,
header=False,
encoding='shift-jis')
[OUT]
ïŒïŒå圢æ çŽ ã®è©³çްæ å ±ïŒnode
ã圢æ çŽ è§£æ(tagger.parse())ã®çµæã«é¢ããŠãããè©³çŽ°ã«æ å ±æœåºããããšãã¯MeCab.Node ãªããžã§ã¯ãã䜿çšããŠè§£æããŸãã
ïŒïŒïŒïŒMeCab.Nodeã®ååŸïŒparseToNode
ãMeCab.Node ãªããžã§ã¯ãã®ååŸã¯âparseToNode(text)âã䜿çšããŸããMeCab.Node ãªããžã§ã¯ãèªäœã¯è€æ°ã®æ å ±ã¯æã£ãŠãããŸããã€ãã©ãã«ãªããžã§ã¯ãã§ã¯ãªãããforæã§æ å ±æœåºã¯ã§ããŸããã
[IN]
import MeCab
tagger = MeCab.Tagger()
text = "ãããããããããã®ãã¡"
node = tagger.parseToNode(text)
print(node)
print(type(node))
print(len(node))[OUT]
<Swig Object of type 'MeCab::Node *' at 0x000001DC80009A30>
<class 'MeCab.Node'>
TypeError: object of type 'MeCab.Node' has no len()ïŒïŒïŒïŒnodeã®è©³çްæ å ±ïŒsurface, feature
ãnodeæ å ±ã®ååŸã¯surfaceãšfeature屿§ã䜿çšããŸãã
surfaceïŒè¡šå±€åœ¢
featureïŒãã®ä»è©³çް
[IN]
node = node.next # æåã®BOSãé£ã°ã
print(node.surface)
print(node.feature)[OUT]
ããã
åè©,æ®éåè©,äžè¬,*,*,*,ã¹ã¢ã¢,æ,ããã,ã¹ã¢ã¢,ããã,ã¹ã¢ã¢,å,*,*,*,*,ã¹ã¢ã¢,ã¹ã¢ã¢,ã¹ã¢ã¢,ã¹ã¢ã¢,*,*,0,C2,*ïŒïŒïŒïŒæ¬¡ã®nodeæ å ±ååŸïŒnode.next
ãã€ãã©ãã«ãªããžã§ã¯ãã§ãã"next(iter())"ã®ããã«ãnodeããæ¬¡ã®æ
å ±ãæœåºããã«ã¯"node.next"ã䜿çšããŸãã
ãäžèšã«nodeãšnode.nextã®IDã確èªããŸãããå¥ç©ã§ããããšã確èªã§ããnode.nextã¯æ¬¡ã®åœ¢æ
çŽ æ
å ±ãä¿æããŠããŸãã
[IN]
print(node)
print(node.next)[OUT]
<Swig Object of type 'MeCab::Node *' at 0x000001DC8000F6B0>
<Swig Object of type 'MeCab::Node *' at 0x000001DC800111F0>ãæ³šæç¹ãšããŠã¡ãœããã®ããã«inplaceãããããã§ãªããããæ å ±ãšããŠæ®ãå Žåã¯nodeã®äžæžã(node=node.next)ãå¿ èŠã§ãã
[IN]
import MeCab
tagger = MeCab.Tagger()
text = "ãããããããããã®ãã¡"
node = tagger.parseToNode(text)
print(f'1ã€ç®ã®åœ¢æ
çŽ : {node.surface}, åè©: {node.feature}')
node = node.next
print(f'2ã€ç®ã®åœ¢æ
çŽ : {node.surface}, åè©: {node.feature}')
node = node.next
print(f'3ã€ç®ã®åœ¢æ
çŽ : {node.surface}, åè©: {node.feature}')
node = node.next
print(f'4ã€ç®ã®åœ¢æ
çŽ : {node.surface}, åè©: {node.feature}')[OUT]
1ã€ç®ã®åœ¢æ
çŽ : , åè©: BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
2ã€ç®ã®åœ¢æ
çŽ : ããã, åè©: åè©,æ®éåè©,äžè¬,*,*,*,ã¹ã¢ã¢,æ,ããã,ã¹ã¢ã¢,ããã,ã¹ã¢ã¢,å,*,*,*,*,ã¹ã¢ã¢,ã¹ã¢ã¢,ã¹ã¢ã¢,ã¹ã¢ã¢,*,*,0,C2,*
3ã€ç®ã®åœ¢æ
çŽ : ã, åè©: å©è©,ä¿å©è©,*,*,*,*,ã¢,ã,ã,ã¢,ã,ã¢,å,*,*,*,*,ã¢,ã¢,ã¢,ã¢,*,*,*,"åè©%F2@-1,圢容è©%F4@-2,åè©%F1",*
4ã€ç®ã®åœ¢æ
çŽ : ãã, åè©: åè©,æ®éåè©,äžè¬,*,*,*,ã¢ã¢,æ¡,ãã,ã¢ã¢,ãã,ã¢ã¢,å,*,*,*,*,ã¢ã¢,ã¢ã¢,ã¢ã¢,ã¢ã¢,*,*,0,C3,*ïŒïŒïŒïŒå šæ å ±ãäžæ¬ååŸ
ãnodeèªäœã¯ã€ãã©ãã«ãªããžã§ã¯ãã§ã¯ãããŸãããã圢æ çŽ ã空ã«ãªã£ãæç¹ã§Falseã«ãªãããwhileæãçšããããšã§å šæ å ±ãæœåºã§ããŸãã
[IN]
import MeCab
tagger = MeCab.Tagger()
text = "ãããããããããã®ãã¡"
node = tagger.parseToNode(text)
while node:
print(f'{"#"*40}')
print(f'圢æ
çŽ : {node.surface}, åè©: {node.feature}')
node = node.next
print(node)[OUT]
########################################
圢æ
çŽ : , åè©: BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
<Swig Object of type 'MeCab::Node *' at 0x000001DC8003C270>
########################################
圢æ
çŽ : ããã, åè©: åè©,æ®éåè©,äžè¬,*,*,*,ã¹ã¢ã¢,æ,ããã,ã¹ã¢ã¢,ããã,ã¹ã¢ã¢,å,*,*,*,*,ã¹ã¢ã¢,ã¹ã¢ã¢,ã¹ã¢ã¢,ã¹ã¢ã¢,*,*,0,C2,*
<Swig Object of type 'MeCab::Node *' at 0x000001DC8003CD70>
########################################
圢æ
çŽ : ã, åè©: å©è©,ä¿å©è©,*,*,*,*,ã¢,ã,ã,ã¢,ã,ã¢,å,*,*,*,*,ã¢,ã¢,ã¢,ã¢,*,*,*,"åè©%F2@-1,圢容è©%F4@-2,åè©%F1",*
<Swig Object of type 'MeCab::Node *' at 0x000001DC8003C270>
########################################
圢æ
çŽ : ãã, åè©: åè©,æ®éåè©,äžè¬,*,*,*,ã¢ã¢,æ¡,ãã,ã¢ã¢,ãã,ã¢ã¢,å,*,*,*,*,ã¢ã¢,ã¢ã¢,ã¢ã¢,ã¢ã¢,*,*,0,C3,*
<Swig Object of type 'MeCab::Node *' at 0x000001DC8003CD70>
########################################
圢æ
çŽ : ã, åè©: å©è©,ä¿å©è©,*,*,*,*,ã¢,ã,ã,ã¢,ã,ã¢,å,*,*,*,*,ã¢,ã¢,ã¢,ã¢,*,*,*,"åè©%F2@-1,圢容è©%F4@-2,åè©%F1",*
<Swig Object of type 'MeCab::Node *' at 0x000001DC8003C270>
########################################
圢æ
çŽ : ãã, åè©: åè©,æ®éåè©,äžè¬,*,*,*,ã¢ã¢,æ¡,ãã,ã¢ã¢,ãã,ã¢ã¢,å,*,*,*,*,ã¢ã¢,ã¢ã¢,ã¢ã¢,ã¢ã¢,*,*,0,C3,*
<Swig Object of type 'MeCab::Node *' at 0x000001DC8003CD70>
########################################
圢æ
çŽ : ã®, åè©: å©è©,æ Œå©è©,*,*,*,*,ã,ã®,ã®,ã,ã®,ã,å,*,*,*,*,ã,ã,ã,ã,*,*,*,åè©%F1,*
<Swig Object of type 'MeCab::Node *' at 0x000001DC8003C270>
########################################
圢æ
çŽ : ãã¡, åè©: åè©,æ®éåè©,å¯è©å¯èœ,*,*,*,ãŠã,å
,ãã¡,ãŠã,ãã¡,ãŠã,å,*,*,*,*,ãŠã,ãŠã,ãŠã,ãŠã,*,*,0,C3,*
<Swig Object of type 'MeCab::Node *' at 0x000001DC8003CD70>
########################################
圢æ
çŽ : , åè©: BOS/EOS,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*
Noneåèè³æ
ããšãã
ã远ã£ãŠè¿œèšïŒãšããããå åºïŒ