TA的每日心情 | 开心 2023-3-10 21:15 |
---|
签到天数: 1329 天 [LV.10]以坛为家III
|
本帖最后由 enjoy了哦 于 2019-3-23 23:23 编辑 5 k6 e# ^2 Z+ _) f9 `. v. L. K) y u
. h C0 h5 k" O7 \; D6 _
通过调查日语单词中音调类型的比例,可以得出一些结论,方便记忆单词本身和其后续助词的音调。, d g6 I. N( j1 r( Q- U/ p9 [/ y5 T
! X3 X( Y7 w+ T5 Y+ A3 E原始数据:新明解国语辞典第5版(EPWING格式)
4 [1 L6 K) w- s! b3 `# d U首先通过 EBDump 打开该EPWING格式词典的文件夹的 HONMON 文件,导出其中的“前方一致表記形見出し”部分,选择全部的1412个block。# u. ` w2 s2 D/ W
4 J! S$ s# L2 J% U" _8 b. I+ F/ \
) ]) W( f1 ^7 F2 ]9 H导出后,将该文件转码成 UTF-8 格式,并使用正则表达式替换部分内容,使其容易被后续分析处理。
! g5 K! s( U1 g" h; K& _
: x4 R& V2 W6 _3 p, F- \" ]- |3 w7 U
为统计尾高型音调,需要知道每个单词的拍数。由于拗音占有两个字符,但只算一拍,为了方便统计,将其中的小的[ゃ][ゅ][ょ] 及对应的片假名(还有小的[ア][イ][ウ][エ][オ]等,外来词专用音节)去掉,即[きゃ][きゅ][きょ]中后面那个字符。这样一来,拍数就等于字符数了。
7 w: p# X* w- y' _3 G$ ]0 a+ z+ i) \( }! X' A
最终的经过清洗的“干净”的数据如下所示,根据个人的习惯进行处理:; P; x4 a% w7 G9 s
8 j& U3 ~3 J$ E+ ^; M
0 |/ @' w! h* p) o9 U然后可以通过 Python 进行统计,一个单词可能有多个音调,但只统计第一个音调(稍微改动源码可以统计所有的音调)。这个代码可以用来明白大致的统计思路,后续还有写零碎的更改,并没有体现在这里面。- X, Y/ `( p6 V. C
- #!/usr/bin/env python8 J- T5 N. d( n ]: W, f
- #_*_ coding:utf-8 _*_) |& O( J; L0 b2 h$ Q
$ K+ }" ~# l0 B3 Y- import sys,os
9 o( H7 q4 W9 S% C) m: l, e - import numpy as np
) n9 K7 V4 d2 w - ( w" l! P5 p, D. H( A3 }, I P
- # 带有音调标记的词汇数目
3 b& U2 K3 ?4 S' f4 w. K; E - all_entry = 04 a6 p6 W1 g& W4 d$ |% j% o( ]2 k
- 0 {* O) c" V) ]
- # 平板型,[0]/ X1 S/ `' C3 N
- entry_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
3 |3 y' v! M; \& r - ( _# i9 s: a2 m
- # 头高型,[1]
8 j2 s% Q' K# B8 L9 f8 {+ | - entry_1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
" B) e3 \5 d Z' }( ~
% ] W, n2 K3 \4 W$ O- # 尾高型,[x] = 拍数# w. [. W# ]' Z6 }
- entry_last_high = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]- {) c `8 i! f" N/ m7 h& ^
" e: u1 d, |+ h7 T% {5 z- # 中高型,[x] < 拍数
2 i# m" E/ f" k7 |9 X! p: n - entry_middle = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
& l7 J1 F' B0 R; z) z
1 K( |6 }5 q* F( m+ L- l% ]. q- file_name = sys.argv[1]
/ C, ]2 ^8 }- S5 K% _% V - f = open(file_name,'rb')
3 P8 I: R1 d% ^ - for line in f:; a5 _$ V& P0 b! B7 x! M' b" r0 Q8 ]
- line = line.replace(b"\r\n",b"")
2 X+ [: X1 g2 _7 g - line = line.decode()& ?( k: j, l: q) R+ A3 _
- db = line.split(',')6 r+ \6 e" u6 I. M0 _) r
- word_len = len(db[0])' \. W/ A$ N) W% G$ O
- if word_len < 16:7 r. u. p' ^2 ? B
- all_entry = all_entry + 1
' P- Q: o$ Y- B# Z: y% `4 n n/ U - for i in range(1,len(db)):1 r& a& W) }) K8 @& l
- accent = db[i]
) _- Q6 O& Q3 t n2 v/ L - if accent.startswith('['):/ W& u: @5 c! D+ }1 B; D4 x: d& f# s
- integer = int(accent[1])
) q2 q! T+ o% ]" G1 c - if integer == 0:2 A) K7 B+ n* G B0 L ]2 c
- entry_0[word_len] = entry_0[word_len] + 1! r# \3 u4 V' t+ Q
- elif integer == 1:
7 V7 Z' q M9 ^) B+ A- m - entry_1[word_len] = entry_1[word_len] + 11 U/ Y- ?3 s8 K- w2 W9 ]
- elif integer == word_len:
$ O2 x! T, m; o* {9 m: G. H0 i - entry_last_high[word_len] = entry_last_high[word_len] + 1
' X3 j5 w. n' j/ i: D - else:5 j5 A; A @4 R4 a
- entry_middle[word_len] = entry_middle[word_len] + 13 i1 h$ k- M* K/ o& T$ | e1 m
- break$ |' @( h1 F M/ Y0 u( O
7 A9 I h% E% k* q: y# P% W- print('[0]:')! o9 Z8 g2 s% k6 l# f& \5 D4 P; ]
- for i in range(1,len(entry_0)):. C; R1 d& ]7 l$ y8 b9 p! {
- print('%d' % (entry_0[i]))
; b6 m5 b" T1 |3 f - print('entries: %d' % np.sum(entry_0))
: B7 j; V2 j! W1 b - print('\n')! ^ K. ^; Z# a; Z9 ?2 N0 L( R9 r& _
N, G* w3 g$ ^) D- print('[1]:')
" T6 {, L" K; M! U - for i in range(1,len(entry_1)):3 }5 Z$ A u# l7 f7 M9 ^
- print('%d' % (entry_1[i]))
! B# l; ?& ] b5 h$ z+ @/ Z - print('entries: %d' % np.sum(entry_1))4 Z: `0 d5 {4 c y! ^+ l& d! C
- print('\n')
3 k4 |2 E0 V1 Z - ; n. A. g5 b1 ~4 t! I$ L
- print('middle high:')
$ M/ e; R+ f) A+ R" M' @ - for i in range(1,len(entry_middle)):* [1 R' \; e; u1 w' A2 S
- print('%d' % (entry_middle[i])); k/ E* t, |' d
- print('entries: %d' % np.sum(entry_middle))% L5 f- [* B( |3 f: j
- print('\n')$ `" B4 N7 T, Z+ Y/ Q
% ?2 s# z: [# g2 k3 q3 W' o+ T- print('last high:')& j* c ^4 M) i5 H5 A: n
- for i in range(1,len(entry_last_high)):5 A) m& l% W' ?8 m. C* b
- print('%d' % (entry_last_high[i]))
; \3 \$ p- C4 m9 ]5 L2 W2 N - print('entries: %d' % np.sum(entry_last_high))
/ q2 I$ o6 J0 N c9 d' a - print('\n')
6 k4 Y4 ?* r; w; ]& q
3 G0 `1 f9 n6 B, @. L- print('all entries:')
$ n# `. X. `) O C6 k2 R% F - print(all_entry)
! N. V) _; T6 c, v6 x
$ l" Q. j8 m+ n" w) u% W- f.close()
复制代码 ' n% C* I/ }$ Z$ R% w
1 ?2 g1 h) o- |7 Z$ z1 N
最后将 Python 输出结果进行数据可视化:) @. O) W# O. G0 K" f: d
. \, t0 J6 v$ E; c7 ]; q
5 J/ p1 h! N- W9 M5 F2 n) z) l, ^7 B
' D/ k% c5 Z, f) w5 Q- c; b# q" _: H0 Y4 E+ n9 Q9 u% C0 [
以及饼图:
9 N% \2 y6 i, |+ b8 X' _8 M3 q8 ?4 p0 e9 K$ X2 u; U0 R3 D" A+ l0 u
$ C" h3 H3 @. c# n! r
可以得出几个结论:
# h' ~4 u0 H J3 o1. 尾高型的单词很少(约2%,大部分在2拍和3拍的单词上,2拍和3拍五五开,总共约1300个单词(在7万多个单词中)。
6 B+ T8 \3 f3 S% B/ z- q2. 头高型的单词次少(约17%),主要集中在3拍的单词上(约51%),2拍和4拍都约占20%左右。
& w4 y" E8 ^" |3. 日语中4拍的单词最多(约42%),并且相当一部分(约72%)是平板型。这和新标日中入门单元里,“声调和语调”部分中“声调”小节里的解说是一样的。
+ g3 R* Q1 t4 w+ W5 w1 w+ P4. 记忆平板型和尾高型的单词时,单词本身发音规律相同,都是前低后高,但后接的助词音调不同,不好记忆。但通过上述统计,可以这么做:(两拍以上)尾高型的单词单独记忆后续助词的音调,其后续助词的音调总是低的,而在一般情况下,一个单词(两拍以上)后接的助词的音调(高或低)和该单词的最后一拍是相同的。一拍的单词完全不符合这个“一般情况”,只需要记住这一拍本身是低还是高,再根据“一个单词中第一拍和第二拍音调必定不同”来确定助词音调。单词本身的音调则通过多听、多用以形成固定的记忆。
# b+ M6 h: c2 ^( O5 _+ Z/ s+ Q+ ~0 N# E/ x
- n' w% p' K: W$ f% G( \* j
r8 a1 p: d- S/ f' u
( F$ e* ^' @4 H8 t" z' [# G
3 x0 } ^. X+ ?+ R% J6 Z3 e! B
" X4 Z) `# p9 |( t
5 k2 Q" t5 J2 C/ P# ^: l |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
2
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
|