TA的每日心情 | 开心 2023-3-10 21:15 |
|---|
签到天数: 1329 天 [LV.10]以坛为家III
|
本帖最后由 enjoy了哦 于 2019-3-23 23:23 编辑
N u: g* j: N# H$ S# w9 Y: J
8 H7 ^8 L0 ?" m# A( z# l通过调查日语单词中音调类型的比例,可以得出一些结论,方便记忆单词本身和其后续助词的音调。( {( S# P/ k y, m% Q& t! W
5 b/ V# g7 N1 f- v原始数据:新明解国语辞典第5版(EPWING格式)
9 A( C1 e q" p: ~首先通过 EBDump 打开该EPWING格式词典的文件夹的 HONMON 文件,导出其中的“前方一致表記形見出し”部分,选择全部的1412个block。7 ?$ i' I$ Z! N# N; B" k' E' E& {
" o; r+ B1 J4 S3 u: d# N" j2 H6 x- k0 [/ y' k2 m
导出后,将该文件转码成 UTF-8 格式,并使用正则表达式替换部分内容,使其容易被后续分析处理。, L9 V9 f4 G; q
1 }2 E% ^! I; ^) Z5 ]
. v2 t% b% _- G为统计尾高型音调,需要知道每个单词的拍数。由于拗音占有两个字符,但只算一拍,为了方便统计,将其中的小的[ゃ][ゅ][ょ] 及对应的片假名(还有小的[ア][イ][ウ][エ][オ]等,外来词专用音节)去掉,即[きゃ][きゅ][きょ]中后面那个字符。这样一来,拍数就等于字符数了。
. l7 r+ f4 H; ^3 E/ I( K) C8 j$ Z& z# P) T2 u) n2 J/ Z
最终的经过清洗的“干净”的数据如下所示,根据个人的习惯进行处理:
* H3 S* S' \ q" l4 L* C
4 {& N6 z, N/ w! }* u1 k9 k6 d* L y( V1 \' D
然后可以通过 Python 进行统计,一个单词可能有多个音调,但只统计第一个音调(稍微改动源码可以统计所有的音调)。这个代码可以用来明白大致的统计思路,后续还有写零碎的更改,并没有体现在这里面。; Y$ x5 p8 g! E, G
- #!/usr/bin/env python
8 v7 d3 T& d' T# ] - #_*_ coding:utf-8 _*_4 C1 h3 C4 P1 p& u
- 8 W0 S. F" ^) V9 k
- import sys,os
( S R6 W) b& u; h* ^8 \' _! O - import numpy as np/ d4 x% W; ^' H; }
* L7 N3 I7 r% {1 J+ x S5 f- # 带有音调标记的词汇数目. u& S1 @: W* E; E( p
- all_entry = 09 W2 n! l1 {; Y
- & ^- r% v1 v( f
- # 平板型,[0]
$ L6 k2 t) p; W) y/ J* P- s - entry_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
a9 K u+ D: V$ R6 F; e. ?
9 k( B6 v2 ]: j: Y2 s- # 头高型,[1]
1 m2 I4 r- U+ g) \3 M - entry_1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
& [) ^9 B; W* s5 c4 t5 ^( {4 U- ~
; A) j2 w. g. o' Y, v" ~* p' H- # 尾高型,[x] = 拍数
! D7 ]6 T; e- L6 N, J' i/ W - entry_last_high = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]7 B% f7 A' H, R2 a9 M5 j
- ' _. R U$ s( Y% Q
- # 中高型,[x] < 拍数5 d+ M0 k' d: @. p6 X7 V1 W5 b
- entry_middle = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
: N H0 n3 l) N3 W1 F E - , V" G; k+ {" }; Y7 z
- file_name = sys.argv[1]
! A6 D; ]9 \, U P1 L/ x - f = open(file_name,'rb')& m/ F" I: Y' r t
- for line in f:
4 O" v- J+ R2 h! e - line = line.replace(b"\r\n",b"")
3 B: @; Z5 ]1 z" Q5 k - line = line.decode()
3 H' u o( S, h( y - db = line.split(',')
5 g% @, ]6 Y% J7 v - word_len = len(db[0])4 ^% r( x9 C2 o( a. T" p6 S
- if word_len < 16:
1 F; o5 T, |& w+ t/ X( Z0 c - all_entry = all_entry + 1( n7 E" T$ r1 F
- for i in range(1,len(db)): a" {- p! n0 y* `
- accent = db[i]$ {6 S7 f- D# Z6 z
- if accent.startswith('['):: w5 v( S3 U2 N! J+ J
- integer = int(accent[1])6 D% \" X1 c9 f' e
- if integer == 0:
t" @# e. a6 i - entry_0[word_len] = entry_0[word_len] + 1$ f! s! M8 u2 k$ ~8 d( J; ]+ _
- elif integer == 1:
# v9 I: A& r* c Y: U8 c - entry_1[word_len] = entry_1[word_len] + 1: d \; E# Z/ Z* L+ v+ x% E* }
- elif integer == word_len:
; X2 d E7 ]/ x: Y, P7 l - entry_last_high[word_len] = entry_last_high[word_len] + 1
( M% D/ j7 R$ S' N - else:& g4 ~ o$ [* g9 F$ z& k* b' H
- entry_middle[word_len] = entry_middle[word_len] + 1
- t/ r0 z8 ^& M2 u. d& C - break
- F1 Z9 K/ I( A3 Q* c9 g7 x - 9 B. P" X0 ]: d+ p7 Y
- print('[0]:')4 l' ~; g' @0 v# k" B
- for i in range(1,len(entry_0)):; I- ^' t) A# E3 e) K
- print('%d' % (entry_0[i]))
8 m* F3 m- _/ e6 U8 O7 n# h# P - print('entries: %d' % np.sum(entry_0))6 B) \( X, z; E5 c. H. F
- print('\n'). @. [$ ~$ q$ H0 n& n9 V
- 1 {4 Z0 C. x4 m5 x
- print('[1]:')5 V! @6 C `* A% g0 Q
- for i in range(1,len(entry_1)):
$ I& m( y4 \( j9 f" y - print('%d' % (entry_1[i]))1 }8 G3 c7 Q. `7 m* ~) s i' @
- print('entries: %d' % np.sum(entry_1))5 w- t8 Z5 z1 c0 v2 K+ n. g/ q
- print('\n')
" S; Y5 r* w3 {3 P G - , u+ G1 j3 X9 ^
- print('middle high:'); ^5 _6 d1 o' d$ b% M O
- for i in range(1,len(entry_middle)):# E* x3 `% c @5 p+ T- }0 M
- print('%d' % (entry_middle[i]))
5 t: W8 Q: y) w9 `2 Q: I - print('entries: %d' % np.sum(entry_middle))
8 v2 t) \, J. f1 V7 X" ] - print('\n') i. _5 m' k2 A5 t
- 2 \6 q$ W: ?5 C' {. y
- print('last high:')6 ]$ C1 o9 g# `9 M# P
- for i in range(1,len(entry_last_high)):
* K! q6 z ~; q - print('%d' % (entry_last_high[i]))
0 e8 N9 z4 s; P1 y$ p9 ~# S- y0 n. m - print('entries: %d' % np.sum(entry_last_high))
: C/ t8 ~% l" W - print('\n')
3 B- L7 X( G- |0 j - 3 `. L' ~0 p: F$ x; C3 M
- print('all entries:')
' T4 Z# }5 t+ |9 H, s" A - print(all_entry)0 U2 V6 O8 W3 O+ Q' q
- ! M- @: l! E; R' w
- f.close()
复制代码 ; V/ i. }1 J, ~ d: Q$ t* w7 [
7 w& X' S- ^- q- ?5 B8 X
最后将 Python 输出结果进行数据可视化:3 |6 R; X! a4 f: U* B& R
) ^: `5 w% v& I0 m( n6 M% R
1 U }. W8 j- O/ o
1 G. K% ?& @% p# e( @, ]$ U
/ w4 a: l- z: N4 e以及饼图:
+ y5 R7 ~/ y9 a3 D/ a4 {! ]* D! E3 o0 K. h9 B* i# z/ N
; S& h; G: d& U- P2 D- R可以得出几个结论:
, S3 t _/ L; o* @1. 尾高型的单词很少(约2%,大部分在2拍和3拍的单词上,2拍和3拍五五开,总共约1300个单词(在7万多个单词中)。% \7 p( }( I7 h) d# k- X" n2 Z
2. 头高型的单词次少(约17%),主要集中在3拍的单词上(约51%),2拍和4拍都约占20%左右。3 F4 Y i" g* _1 F' W
3. 日语中4拍的单词最多(约42%),并且相当一部分(约72%)是平板型。这和新标日中入门单元里,“声调和语调”部分中“声调”小节里的解说是一样的。# N. ~; `/ j1 c; {$ {6 E
4. 记忆平板型和尾高型的单词时,单词本身发音规律相同,都是前低后高,但后接的助词音调不同,不好记忆。但通过上述统计,可以这么做:(两拍以上)尾高型的单词单独记忆后续助词的音调,其后续助词的音调总是低的,而在一般情况下,一个单词(两拍以上)后接的助词的音调(高或低)和该单词的最后一拍是相同的。一拍的单词完全不符合这个“一般情况”,只需要记住这一拍本身是低还是高,再根据“一个单词中第一拍和第二拍音调必定不同”来确定助词音调。单词本身的音调则通过多听、多用以形成固定的记忆。: S' P( \7 G H3 f6 g$ m/ ?2 O7 _
$ r* b6 ]# V" `! t+ j# `% e
, P) P' Y: s2 @/ F B7 x- C) M; a" {* ]7 u$ k
5 G& d5 A0 O% I* r
2 b/ U+ p4 {$ A" u. [( V2 G9 e" q4 D8 A6 U) y. Z S" {
* L8 N* N* R6 L/ x- I$ T8 k
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
2
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
|