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

ïŒïŒç°å¢æ§ç¯
ãjanomeã®ç°å¢æ§ç¯ã¯pipã§ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããã ãã§ãã
[Terminal]
pip install janomeïŒïŒåœ¢æ çŽ è§£æïŒTokenizer()
ãæ¬ç« ã§ã¯åºç€æäœã玹ä»ããŸããAPIã¯å ¬åŒDocsåç §ããŸããã
ïŒïŒïŒïŒåœ¢æ çŽ ã»åè©ç¢ºèª
ãæãã·ã³ãã«ã«åœ¢æ çŽ è§£æããå Žåã¯janomeã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠæç« ãå ¥ããã ãã§ãã
[IN]
from janome.tokenizer import Tokenizer
t = Tokenizer()
text = 'ãããããããããã®ãã¡' #æç«
for token in t.tokenize(text):
print(token)
print(type(next(iter(t.tokenize(text))))) #ååŒã®ç¢ºèªçš
[OUT]
ããã åè©,äžè¬,*,*,*,*,ããã,ã¹ã¢ã¢,ã¹ã¢ã¢
ã å©è©,ä¿å©è©,*,*,*,*,ã,ã¢,ã¢
ãã åè©,äžè¬,*,*,*,*,ãã,ã¢ã¢,ã¢ã¢
ã å©è©,ä¿å©è©,*,*,*,*,ã,ã¢,ã¢
ãã åè©,äžè¬,*,*,*,*,ãã,ã¢ã¢,ã¢ã¢
ã® å©è©,é£äœå,*,*,*,*,ã®,ã,ã
ãã¡ åè©,éèªç«,å¯è©å¯èœ,*,*,*,ãã¡,ãŠã,ãŠã
<class 'janome.tokenizer.Token'>ãåºåã¯janomeã¯ã©ã¹ã®ããå¿ èŠãªæ å ±ã®æœåºã¯æå®ã®ã¡ãœãã/ããããã£ã䜿çšããŸããäž»èŠãªããããã£ã¯äžèšã®éãã§ãã
ãtokenã®ããããã£ã
âsurfaceïŒåèª
âpart_of_speechïŒåè©æ å ±
[IN]
from janome.tokenizer import Tokenizer
t = Tokenizer()
text = 'ãããããããããã®ãã¡' #æç«
token = next(iter(t.tokenize(text))) #1åã ãååŸ
print(token)
print('token.surface:', token.surface)
print('token.part_of_speech:', token.part_of_speech)
print('token.infl_type:', token.infl_type)
print('token.infl_form:', token.infl_form)
print('token.base_form:', token.base_form)
print('token.reading:', token.reading)
print('token.phonetic:', token.phonetic)
[OUT]
ããã åè©,äžè¬,*,*,*,*,ããã,ã¹ã¢ã¢,ã¹ã¢ã¢
token.surface: ããã
token.part_of_speech: åè©,äžè¬,*,*
token.infl_type: *
token.infl_form: *
token.base_form: ããã
token.reading: ã¹ã¢ã¢
token.phonetic: ã¹ã¢ã¢ïŒïŒïŒïŒåãã¡æžãã¢ãŒã(åèªã®ã¿æœåº)ïŒwakati
ãåè©æ
å ±ã¯äžèŠã§ããåèªã ãæœåºãããå Žåã¯åãã¡æžãã¢ãŒãã䜿çšããŸããæ¬ã¢ãŒãã¯"t.tokenize(wakati=True)"ãšããããæ¯ååãã¡æžãã¢ãŒãã«ãããªãã€ã³ã¹ã¿ã³ã¹åã®ãšãã«"wakati=True"ãæž¡ããŸãã
ãåãã¡æžãã¢ãŒãã®æã¯ååºåã¯stråãšãªããŸãã
[IN]
from janome.tokenizer import Tokenizer
t = Tokenizer()
text = 'ãããããããããã®ãã¡' #æç«
for token in t.tokenize(text, wakati=True): #åãã¡æžãã¢ãŒã
print(token)
print(type(next(iter(t.tokenize(text, wakati=True))))) #ååŒã®ç¢ºèªçš
[OUT]
ããã
ã
ãã
ã
ãã
ã®
ãã¡
<class 'str'>[IN]
from janome.tokenizer import Tokenizer
t = Tokenizer(wakati=True) #åãã¡æžãã¢ãŒã
text = 'ãããããããããã®ãã¡' #æç«
print(list(t.tokenize(text))) #åãã¡æžãã¢ãŒãã§åºå
[OUT]
['ããã', 'ã', 'ãã', 'ã', 'ãã', 'ã®', 'ãã¡']ïŒïŒïŒïŒãµã³ãã«ã³ãŒã
ãããã¹ããè€æ°çšæããŠã©ã®ããã«åœ¢æ çŽ è§£æãããã確èªããŸãããå šéšã²ãããªã ãšç²ŸåºŠãäœãã§ãããæŒ¢åãåãããæç« ã§ã¯æ¯èŒçããçµæãåŸãããŸããã
[IN]
from janome.tokenizer import Tokenizer
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 = [] #åºåãããªã¹ã
t = Tokenizer(wakati=True)
for text in texts:
outputs.append(list(t.tokenize(text)))
pd.DataFrame(outputs).to_csv('janome_wakati.csv',index=False, header=False, encoding="shift-jis") #Excelã«åºå
[OUT]
ïŒïŒåœ¢æ çŽ åæïŒAnalyzer()
ã圢æ çŽ è§£æããçµæãåæããã®ã¯Analyzer()ã䜿çšããŸãã
ïŒïŒïŒïŒæå®åè©ã®æœåºïŒPOSKeepFilter
ãæå®åè©ãæœåºããå Žåã¯POSKeepFilter([<æœåºãããåè©>])ãAnalyzerã®token_filtersã«æž¡ããŸãã
[IN]
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *
text = 'ãããããããããã®ãã¡'
token_filters = [POSKeepFilter(['åè©'])]
for token in Analyzer(token_filters=token_filters).analyze(text):
print(token)
[OUT]
ããã åè©,äžè¬,*,*,*,*,ããã,ã¹ã¢ã¢,ã¹ã¢ã¢
ãã åè©,äžè¬,*,*,*,*,ãã,ã¢ã¢,ã¢ã¢
ãã åè©,äžè¬,*,*,*,*,ãã,ã¢ã¢,ã¢ã¢
ãã¡ åè©,éèªç«,å¯è©å¯èœ,*,*,*,ãã¡,ãŠã,ãŠãïŒïŒïŒïŒåè©æ°ã®ã«ãŠã³ãïŒTokenCountFilter()
ãæå®ããåè©ã®æ°ãã«ãŠã³ãããããã«ã¯token_filtersã«æå®ã®ã¢ãžã¥ãŒã«ãæž¡ããŸããåºåã¯æåå(str)ãšæ°å€(int)ã§åºåãããŸãã
[IN]
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *
text = 'ãããããããããã®ãã¡'
token_filters = [POSKeepFilter(['åè©']), TokenCountFilter()]
a = Analyzer(token_filters=token_filters)
for k, v in a.analyze(text):
print(k, v)
[OUT]
ããã 1
ãã 2
ãã¡ 1ãååšããªãåè©ãéžãã å Žåã¯ç©ºãªã¹ãã§åºåãããŸãã
[IN]
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *
text = 'ãããããããããã®ãã¡'
token_filters = [POSKeepFilter(['åè©']), TokenCountFilter()]
token_filters2 = [POSKeepFilter(['å©è©']), TokenCountFilter()]
token_filters3 = [POSKeepFilter(['åè©']), TokenCountFilter()]
print('åè©', list(Analyzer(token_filters=token_filters).analyze(text)))
print('å©è©', list(Analyzer(token_filters=token_filters2).analyze(text)))
print('åè©', list(Analyzer(token_filters=token_filters3).analyze(text)))
[OUT]
åè© [('ããã', 1), ('ãã', 2), ('ãã¡', 1)]
å©è© [('ã', 2), ('ã®', 1)]
åè© []ïŒïŒjanomeã§éãã§ã¿ãïŒæè±ªã®æç« å¯èŠå
ãjanomeã§æè±ªããã䜿çšããæåã®å¯èŠåã宿œããŸããã
ïŒïŒïŒïŒãµã³ãã«ããŒã¿ã®ååŸïŒé空æåº«
ãä»åã®ãµã³ãã«ããŒã¿ã¯é空æåº«ããã倪宰治ã人éå€±æ Œãã䜿çšããŸããããã¡ãã®ããŒã¿ã¯Beautiful Soupã䜿çšããŠã¹ã¯ã¬ã€ãã³ã°ããŸããã
ããªãjanomeã§åŠçãããããäžèŠãªæåã³ãŒãã¯clean_text()颿°ãäœæããŠé€å»ããŸããã
[IN]
import requests
from bs4 import BeautifulSoup
url ='https://www.aozora.gr.jp/cards/000035/files/301_14912.html' #é空æåº«_倪宰治ïŒäººéå€±æ Œ
res = requests.get(url)
soup = BeautifulSoup(res.content, 'html5lib')
# print(soup.prettify()) #æ§é ã確èª
def clean_text(text):
text = text.replace('\u3000', '') #å
šè§ã¹ããŒã¹ãæ¶ã
text = text.replace('\n', '') #æ¹è¡ãæ¶ã
return text
_main_text = soup.select_one('.main_text')
main_text = clean_text(_main_text.text)
main_text
[OUT]
'ã¯ãããç§ã¯ããã®ç·ã®åçãäžèãèŠãããšããããäžèã¯ããã®ç·ã®ã幌幎æä»£ããšã§ãèšãã¹ãã§ãããããåæ³ååŸããšæšå®ãããé ã®åçã§ãã£ãŠããã®åäŸã倧å¢ã®å¥³ã®ã²ãšã«åããããŸããïŒããã¯ããã®åäŸã®å§ãã¡ã効ãã¡ããããããåŸå§åйïŒããšãïŒãã¡ããšæ³åãããïŒåºåã®æ± ã®ã»ãšãã«ãèãçžã®è¢ŽïŒã¯ããŸïŒãã¯ããŠç«ã¡ãéŠãäžå床ã»ã©å·Šã«åŸããéãç¬ã£ãŠããåçã§ãããéãïŒããã©ããéã人ãã¡ïŒã€ãŸããçŸéãªã©ã«é¢å¿ãæãã¬äººãã¡ïŒã¯ãé¢çœããäœãšãç¡ããããªé¡ãããŠãã坿ãåã¡ããã§ããããšããå æžãªãäžèŸãèšã£ãŠãããŸããã空ïŒããïŒãäžèŸã«èããªããããã®ãè¬ïŒãïŒãã°éä¿ã®ã坿ããããã¿ãããªåœ±ããã®åäŸã®ç¬é¡ã«ç¡ãããã§ã¯ãªãã®ã ããããããããããã§ããçŸéã«å°±ããŠã®èšç·ŽãçµãŠæ¥ãã²ãšãªããã²ãšãèŠãŠãããããªããŠããããªåäŸã ããšé ïŒããã¶ïŒãäžå¿«ããã«åïŒã€ã¶ãïŒããæ¯è«ã§ãæãã®ããæã®ãããªæã€ãã§ããã®åçãã»ããæããããç¥ããªãããŸã£ããããã®åäŸã®ç¬é¡ã¯ãããèŠãã°èŠãã»ã©ãäœãšãç¥ããïŒïŒïŒïŒåè©ã®ã¿æœåº
ãå¯èŠåã«ã¯WordCloudã䜿çšããŸããæç« ããã®ãŸãŸæž¡ããš"ãŠã«ãã¯"ãªã©ã®å©è©ãå€ãåºçŸããããåŸåãèŠãã«ããã§ããããã§Analyzer()ã䜿çšããŠåè©ã®ã¿æœåºããŸããã
ããªãWordCloudãåŠçã§ããããã«åè©éã«ã¯ã¹ããŒã¹ã远å ããŸããã
[IN]
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *
text_output = ''ã
token_filters = [POSKeepFilter(['åè©'])]
for token in Analyzer(token_filters=token_filters).analyze(main_text):
text_output += ' ' + token.surface #åèªéã«ã¹ããŒã¹ãå
¥ãã
print(text_output)
[OUT]
ã¯ã ç§ ç· åç äž è ããš äžè ç· å¹Œå¹Ž æä»£ å æ³ ååŸ æšå® é åç åäŸ å€§å¢ å¥³ ã²ãš ãã åäŸ å§ã㡠効 ãã¡ åŸå§åй ããšã ãã¡ æ³å åºå æ± ã»ãšã çž è¢Ž ã¯ããŸ éŠ äž å 床 å·Š åç 人 ãã¡ çŸé é¢å¿ 人 ãã¡ ãã é¡ åã¡ãã äžèŸ 空 äžèŸ è¬ ã éä¿ ã ã¿ãã 圱 åäŸ ç¬é¡ ãã ã® çŸé èšç·Ž ã²ãš ã²ãš ã ãã ïŒïŒïŒïŒå¯èŠåïŒWordCloud
ãæåŸã«WordCloudã§å¯èŠåããŸããåè©ã®ã¿æœåºããããšã§ããŒã¯ãŒããæç¢ºã«ãªããŸãããâããâãâããâãªã©ã®äžèŠãªæåãæããŠããã°æç« å ã§éèŠãªã¯ãŒããèŠããããã«ãªããããããŸããã
[IN]
import matplotlib.pyplot as plt
import japanize_matplotlib
fig = plt.figure(figsize=(16, 12))
plt.rcParams["font.size"] = 20 #ãã©ã³ããµã€ãºãä¿®æ£
ax1 = fig.add_subplot(121) #subplot(è¡ååŸã®index)ã¯0ã§ã¯ãªã1ããéå§
ax2 = fig.add_subplot(122)
#ååŠçãªãã®éåžžã®æç«
wc_origin = WordCloud(width=1200, height=720,
background_color='white',
font_path='meiryo.ttc').generate(main_text)
#åè©ã®ã¿ãæœåºããæç«
wc_noun = WordCloud(width=1200, height=720,
background_color='white',
font_path='meiryo.ttc').generate(text_output)
ax1.imshow(wc_origin)
ax1.axis('off') #軞ã®è¡šç€ºãæ¶ã
ax1.set_title('ãªãªãžãã«')
ax2.imshow(wc_noun)
ax2.axis('off') #軞ã®è¡šç€ºãæ¶ã
ax2.set_title('åè©ã®ã¿æœåº')
plt.show()
[OUT]
åèè³æ
ããšãã
ãã©ããã§æžããæ°ãããŠãããwordcloudã§å°ãæžããŠãã»ã»ã»