TA的每日心情 | 开心 2023-3-10 21:15 |
|---|
签到天数: 1329 天 [LV.10]以坛为家III
|
本帖最后由 enjoy了哦 于 2019-3-23 23:23 编辑 ' t# e! b: X4 x4 x; d3 p3 D
7 K( o, V u& L9 m- @3 Q
通过调查日语单词中音调类型的比例,可以得出一些结论,方便记忆单词本身和其后续助词的音调。# L8 @/ \+ _% k$ R, i' ~% B
: A* O; u$ P0 k+ ^8 ~0 O原始数据:新明解国语辞典第5版(EPWING格式)" L: z1 x& D+ L2 {1 \/ e8 q
首先通过 EBDump 打开该EPWING格式词典的文件夹的 HONMON 文件,导出其中的“前方一致表記形見出し”部分,选择全部的1412个block。: ]6 T, M" i% R, c6 Y
2 d" ], K4 F# p1 v" U2 I( G
* w! V! P0 k1 v导出后,将该文件转码成 UTF-8 格式,并使用正则表达式替换部分内容,使其容易被后续分析处理。: }5 E) D6 Y3 K' d# g
. ?( A R: W' B9 `
- X3 p% _; T4 |为统计尾高型音调,需要知道每个单词的拍数。由于拗音占有两个字符,但只算一拍,为了方便统计,将其中的小的[ゃ][ゅ][ょ] 及对应的片假名(还有小的[ア][イ][ウ][エ][オ]等,外来词专用音节)去掉,即[きゃ][きゅ][きょ]中后面那个字符。这样一来,拍数就等于字符数了。
" j5 o4 r; |8 b( t6 Z
! S9 p+ g' @6 g最终的经过清洗的“干净”的数据如下所示,根据个人的习惯进行处理:0 c1 N1 I0 z* }3 Y" I0 u
" E' j$ Z( f" E7 A7 z* M) ^. \) ]+ A8 u
然后可以通过 Python 进行统计,一个单词可能有多个音调,但只统计第一个音调(稍微改动源码可以统计所有的音调)。这个代码可以用来明白大致的统计思路,后续还有写零碎的更改,并没有体现在这里面。
- z( _; U- P* ~$ e1 m- #!/usr/bin/env python0 _ k! `0 m4 w$ }2 A
- #_*_ coding:utf-8 _*_" o! t) W- _, {" R
- 6 o9 a& W' v- Z3 `: M9 `
- import sys,os
$ z Q5 n# N' B2 D3 Q0 I+ e - import numpy as np8 I5 q0 j/ L6 L( I% A$ h
- 2 y! c5 w0 I/ {& c# ^1 P" R
- # 带有音调标记的词汇数目) U" W. n4 C6 f6 I$ R1 D+ \
- all_entry = 0
: ], G x H. n
. n, H: g( `3 H `2 A* K- # 平板型,[0]: s9 z+ c' T ~3 L& i; b2 t
- entry_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- w/ L) Y* m4 d, D, B: r4 n& ]- ?
8 S3 d7 U& l3 u: \- # 头高型,[1]
}- D; @4 ^; K' R - entry_1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
5 \9 {* h% D0 D; J" X - # l! h( R0 L' ^# i
- # 尾高型,[x] = 拍数0 K! ~" E( y% g" ~# F2 @; K
- entry_last_high = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]+ ]! Z& @5 p: h. b( l
- " o8 r4 o" |# @+ F3 E
- # 中高型,[x] < 拍数
+ J: i" M- O6 Z: m I9 ^) n3 ^7 ^ - entry_middle = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
h5 }* G# Q6 S0 r - ! t; x! D4 j, l! y8 P8 }
- file_name = sys.argv[1]5 p# i3 U1 q$ I7 p5 p* C
- f = open(file_name,'rb')$ o$ M$ y/ y. n/ P1 U4 U) @
- for line in f:$ X1 L( g. I% B9 y6 s' \1 ^
- line = line.replace(b"\r\n",b"")" o" `4 r q1 n# |% ^8 g8 d- O$ j
- line = line.decode()
6 }% e. R1 y8 W; w2 u7 I, e8 k1 @ - db = line.split(','): H" N& O& s: X3 t' p3 s
- word_len = len(db[0])
9 @" d. J6 a4 g9 a! E9 e( z' `/ ` - if word_len < 16:
( h& M7 r# d! ^( I7 y - all_entry = all_entry + 1
3 W# I2 J0 C; Y# B) z8 R8 Q3 P - for i in range(1,len(db)):6 n* z8 D% X R2 L& l# _* t
- accent = db[i]
, S' l" F" S) j# _! w - if accent.startswith('['):
2 T9 k* r3 _" n2 k5 j1 W - integer = int(accent[1])8 w: W. V" y( [5 ^: i( \ i6 z7 L& A
- if integer == 0:+ O0 T+ V- G3 G
- entry_0[word_len] = entry_0[word_len] + 15 F/ |: ]2 l+ Y+ ]$ v, i3 ]
- elif integer == 1:
) [- w" M6 F$ A4 C& S - entry_1[word_len] = entry_1[word_len] + 1
8 `8 c. {, @1 l, b0 z - elif integer == word_len:
5 l/ m) ` y$ t J I - entry_last_high[word_len] = entry_last_high[word_len] + 1
; L2 R4 i5 ^( a. [( C# x/ Z2 I - else:$ p0 Z2 r: {; z$ z
- entry_middle[word_len] = entry_middle[word_len] + 1+ |; m) ?- U7 j2 g7 `; j
- break
L5 W, C: \ u - , V5 j' R: ~; I2 h8 T6 t6 ?
- print('[0]:')
, w! v2 n( k" ^3 b - for i in range(1,len(entry_0)):
7 S! P& }7 @" E - print('%d' % (entry_0[i]))
5 B' q8 `8 _2 {% D4 U. n - print('entries: %d' % np.sum(entry_0))" }3 j4 e4 O! p! G. ?' u
- print('\n')( m# K' y! f- X( A2 h. ]! V4 c
- 7 ?" \) w, T5 r( r! s) K
- print('[1]:')" {4 z: ]) N+ V' @
- for i in range(1,len(entry_1)):4 {8 m/ v% j( f; r
- print('%d' % (entry_1[i]))
l# k, w: B4 p$ u- V - print('entries: %d' % np.sum(entry_1))6 O k3 L C/ p; P0 {
- print('\n')
$ w( W; R/ e5 T - 1 ?. f2 S( v3 w3 O; n9 Y
- print('middle high:')
& }) j# Q7 M4 w- ?6 Y - for i in range(1,len(entry_middle)):. W3 W4 ~0 H G9 A y, d# ]+ j) l
- print('%d' % (entry_middle[i]))
2 {- \ S5 D- g5 F8 e& ~3 p$ [ - print('entries: %d' % np.sum(entry_middle))' a3 L1 N$ n( o. Q( ~
- print('\n')
, z; ~0 W. Y/ ~- k - 7 P) P i3 D& k* B1 V( S! k
- print('last high:')
9 n9 J0 W+ m5 A - for i in range(1,len(entry_last_high)):
) e7 c' O2 X2 \$ t - print('%d' % (entry_last_high[i])), P4 S X4 H, Z
- print('entries: %d' % np.sum(entry_last_high))
3 p) w5 e5 y q$ v1 q+ u - print('\n')( ]0 o/ G! t d% @
4 C9 w! L$ C! a) m; i3 }- print('all entries:')
7 k' V: D$ z4 D( {; L - print(all_entry)# W% @+ s" Q9 h4 | i( E( o1 j
v( N7 X! f: U& x% `3 E- f.close()
复制代码
0 e4 Q, ?" K* ]& H# R
3 G" m- b9 y3 E8 b, \: [6 C: ]8 [+ B最后将 Python 输出结果进行数据可视化:
: I7 c, A7 n+ j. Z2 t9 y% w$ S8 B3 z' T- w5 {
a9 o* j. A- O
9 P8 H2 j7 T0 [+ M! L4 E
4 V% u8 \' N" C以及饼图:( m, h- M; h% m5 Y# I5 i
9 {$ P2 x* E; b2 ~) A3 q
" X4 W) ^" c, ]! f9 ]可以得出几个结论:& f0 g6 i4 D" S% n3 y. P
1. 尾高型的单词很少(约2%,大部分在2拍和3拍的单词上,2拍和3拍五五开,总共约1300个单词(在7万多个单词中)。
" `7 a" s1 _5 ] U$ B* i2. 头高型的单词次少(约17%),主要集中在3拍的单词上(约51%),2拍和4拍都约占20%左右。
. ?2 b5 w4 T6 l8 t% ?3. 日语中4拍的单词最多(约42%),并且相当一部分(约72%)是平板型。这和新标日中入门单元里,“声调和语调”部分中“声调”小节里的解说是一样的。
9 O9 L6 m# W8 E" E4. 记忆平板型和尾高型的单词时,单词本身发音规律相同,都是前低后高,但后接的助词音调不同,不好记忆。但通过上述统计,可以这么做:(两拍以上)尾高型的单词单独记忆后续助词的音调,其后续助词的音调总是低的,而在一般情况下,一个单词(两拍以上)后接的助词的音调(高或低)和该单词的最后一拍是相同的。一拍的单词完全不符合这个“一般情况”,只需要记住这一拍本身是低还是高,再根据“一个单词中第一拍和第二拍音调必定不同”来确定助词音调。单词本身的音调则通过多听、多用以形成固定的记忆。
5 @3 C7 U' c! b
8 L5 V: K0 s: m) _; D
0 d$ l7 Q7 m/ ^( ]" F; t: L5 ]& E; y7 b/ n. M1 {- w
q4 j5 j1 H6 N& \% |( N% A4 N
2 f5 U1 l/ o( y: f
6 W0 ^/ i: P6 s; @
2 i7 ]* W/ q* n& Z9 K4 W0 [& Q- P |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
2
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
|