日语python怎么说_python+Mecab,一次性学会日语分词
某天在磕N1聽力材料的時候,突然想到:“如果把聽力里的高頻詞都背熟,那我的日語聽力豈不是暢通無阻?”(我可真是個小機靈鬼)
實現思路就是“分詞+統計”,先寫一個日語詞頻統計小程序再說。
于是,說搞就搞。
日語分詞包
調研(google)了一下,發現日語也有類似jieba這樣的分詞包,用的比較多的是Mecab,類似的還有ChaSen、JUMAN這些,可以看下這幾個的對比。對于簡單的分詞統計來說,Mecab夠用了。
對日語分詞包感興趣的朋友可以參考這個:日文分詞器 Mecab 文檔 | 我愛自然語言處理?www.52nlp.cn
安裝Mecab
和python其他包的安裝類似,一行代碼解決問題
pip install mecab-python3
小試牛刀
裝完之后,在python里導入Mecab,順便看看是否成功安裝
import MeCab
如果沒問題的話,那就可以進入正題了,先找一句話來練練手。天気がいいから、散歩しましょう
text = "天気がいいから、散歩しましょう"
mecab_tagger = MeCab.Tagger("-Owakati")
mecab_tagger.parse(text)
輸出的結果是:
Out[1]:'天気 が いい から 、 散歩 し ましょ う \n'
可以看到,每個詞中間都被一個空格隔開了,這個時候再稍加處理一下,就可以得到一個分詞的list了:
In [2]:mecab_tagger.parse(text).split()[:-1]#[:-1]是為了把末尾的\n去掉
Out[2]: ['天気', 'が', 'いい', 'から', '、', '散歩', 'し', 'ましょ']
簡單的分詞就這樣完成了!
詞性區分和變形詞
在實際的應用場景中,往往不是這種簡單的分詞就可以的,比如有時候需要針對名詞進行詞頻統計,這就涉及到詞性的區分。
在上面的代碼中,我們用到了"-Owakati",這是一個只用于詞語分割的模式,全稱應該是「わかち書き」。比較常用的還有一個模式是"-Ochasen",舉個例子感受一下:
mecab_tagger = MeCab.Tagger("-Ochasen") # `-Owakati` 只做分詞
text = "ご飯を食べましたか"
print(mecab_tagger.parse(text))
輸出的結果是:
ご飯 ゴハン ご飯 名詞-一般
を ヲ を 助詞-格助詞-一般
食べ タベ 食べる 動詞-自立 一段 連用形
まし マシ ます 助動詞 特殊?マス 連用形
た タ た 助動詞 特殊?タ 基本形
か カ か 助詞-副助詞/並立助詞/終助詞
EOS
##原格式是'ご飯\tゴハン\tご飯\t名詞-一般\t\t\nを\tヲ\tを\t助詞-格助詞-一般\t\t\n食べ\tタベ\t食べる\t動詞-自立\t一段\t連用形\nまし\tマシ\tます\t助動詞\t特殊?マス\t連用形\nた\tタ\tた\t助動詞\t特殊?タ\t基本形\nか\tカ\tか\t助詞-副助詞/並立助詞/終助詞\t\t\nEOS\n'
從上面的結果可以看到,輸出的內容包括:分詞結果、讀音、原形詞、詞性等各類信息,基本上可以滿足日常需求了。這里面我個人比較常用的是詞性+原形詞,尤其是原形詞。畢竟大家都知道,日語里各種動詞變形簡直要了老命,而在做詞頻統計的時候直接根據原形詞統計會方便很多,也可以算是數據清洗的一種方式。
可以根據自己的需要選擇都需要哪些信息,以下是代碼示例
mecab_tagger = MeCab.Tagger("-Ochasen") #注意選定需要的模式
#自定義分詞輸出的格式
def format_tag_result(x):
pieces = []
for i in x.splitlines()[:-1]: #結尾的"EOS"順手去掉
i = i.split()
pieces.append((i[0], i[-1]))#選擇需要的內容
return pieces
text = "天気がいいから、散歩しましょう"
print(format_tag_result(mecab_tagger.parse(text)))
輸出的結果:
[('天気', '名詞-一般'), ('が', '助詞-格助詞-一般'), ('いい', '基本形'), ('から', '助詞-接続助詞'), ('、', '記號-読點'), ('散歩', '名詞-サ変接続'), ('し', '連用形'), ('ましょ', '未然ウ接続'), ('う', '基本形')]
好了,到這里為止,關于Mecab的基本用法就介紹完了。
一個栗子:N考真題文本分詞統計
找了一份歷年聽力真題的txt文本,進行高頻詞統計。
"""
Created on Sun Apr 12 11:44:30 2020
@author: chenlufan
"""
import MeCab
import pandas as pd
file_in = open('test.txt')
f_line = file_in.read()
mecab_tagger = MeCab.Tagger("-Ochasen")
result=mecab_tagger.parse(f_line)
my_list = []
for i in result.splitlines()[:-1]:
i = i.split()
try:
v = (i[2], i[1], i[-1])
except:
pass
my_list.append(v)
word_dict = {}
word_sub = {}
word_pro={}
for i in my_list:
if i[-1].split('-')[0] not in ['助詞','記號']:
if i[0] not in word_dict:
word_dict[i[0]]=1
word_sub[i[0]]=i[-1]
word_pro[i[0]]=i[1]
else:
word_dict[i[0]] =word_dict[i[0]]+1
df =pd.DataFrame({"fre":word_dict,'pro':word_pro,'sub':word_sub})
df=df[df.fre>1]
df=df.sort_values(by=['fre'],ascending=False)
df.to_csv('N1聽力分詞.csv')
輸出的結果(參考):
結語
之所以寫這篇文章,是因為正好把兩個熟悉的東西結合到了一起——python和日語。學了很多東西之后,現在漸漸開始感受到跨學科產生的新樂趣。不過不管怎么說,更重要的是有趣的想法,工具只是幫助夢想照進現實而已。
以上。
總結
以上是生活随笔為你收集整理的日语python怎么说_python+Mecab,一次性学会日语分词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 羊都被薅秃了 阿根廷区游戏85%都是他国
- 下一篇: python文件行数统计_文件行数和代码