TA的每日心情 | 擦汗 2019-11-13 23:25 |
|---|
签到天数: 44 天 [LV.5]常住居民I
|
本帖最后由 ipda_cluo 于 2019-1-10 10:21 编辑
$ R' Y4 d, l. j9 U `$ d; @; B: R: `* Q5 b; e; Y% f: N
今天真的是超级闲,再发一个我平时用来整理生词的工具,供大家借鉴。& ~: V, h# }* _2 f1 x1 H6 C
背景:
/ t. V& X# n Y9 ~+ [我使用欧陆词典唯一的原因就是,这玩意带一个云端生词本,可以把我在手机上、电脑上,pad上看资料,看书等查过的单词记录下来。这就解决了我制作自己生词本的最基本攒词的问题了。5 x+ e) K5 Y, }5 d3 q3 a8 C
攒了一段时间生词后,接下来就得背这些单词,我我是懒癌患者,指望我记笔记整理生词是不可能的。所以我选择了用知米背单词,扇贝单词这类app,把我的生词本导进去背诵,这样既省力,又容易坚持,还可以借用app所谓的“科学记忆法”。
T" ~+ y# e0 k1 l: Y) x但问题来了,如果有人看过自己查词记录就知道,查过的单词是需要整理的,没整理前的查词记录有这些问题:; ^+ l; p& D0 U) I* o" m; M0 b: d
1,有些查过的单词根本不是单词,比如人名,比如拼写错误等等,把这些单词当做生词背下来那可真是天理不容。0 H/ W2 {2 |& M* Y- f
2,很多单词各种变体,比如ing形式,ed形式等等。虽说有些时候背诵这种形式也很有用,但还是力气实在刀刃上,源词都没背下来,你去背ing形式干嘛?
$ X) U& h* `: G3 z! Q8 x6 D: {3,词频过低,有些单词可能是个组合词,或者使用率极低的词,及时背完了,以后一辈子都用不到,跟没背一样。也会忘记。6 Y0 m3 B0 k- A# `2 ?2 t
. x1 D8 V4 z* M% c+ s# S3 R' o. zSo,怎么解决呢?
; E- G# N9 R. P. K) r6 z- a
) [) _# ~7 Q6 U ~1,导出生词本,这个大家研究一下欧陆词典,应该都会9 F8 X* |8 C# o/ J3 w% D
2,清洗生词本
" S: W& W$ d' b% a( l3 F i7 H a)去除不存在的词。方法比较简单,在词典里查一下,如果查不到,那就是不存在的词。
x6 r' g+ {. \2 N b)还原到变体前形式,这个有意思了,混这个论坛里的 人 ,如果我和你们说说直接把单词后面的ing,ed字母去掉,肯定会骂我的。大家可还记得有道在线词典查这种词的结果?
. u2 y0 ^2 b' D! ]7 o: b! n7 g6 ~) ^0 m6 f: P1 Q. |! e+ W
看,对于这种单词,有道翻译后面一般都会有一个 xxx的yyy形式。对,这里xxx就是源词。8 {8 l6 }1 \3 A0 R. p9 u: ~8 N
那剩下的就简单了,有道查一遍,找到那个xxx就可以啦。7 C' }# K: y8 V, ~+ K
c)去除重复,之前做了还原,肯定有很多重复的单词
. U2 ^; |. p. I d) 根据词频排序,筛选
; g4 k; P0 j7 K" J 与去除单词方法一样,很多词典里面都包含了词频数据,找到后做个排序就可以了。7 H4 D& i0 \6 v1 S6 F
3, 导入到背单词工具里面,退出懒人模式,开背。
: ^ V7 p9 m: W4 ]! N H" I( U9 r& f4 T' g" \) |
方法有了,剩下的就是写工具来搞定啦,人肉一个个查肯定要吐血的,安装python,复制如下代码到文件里,改名为py. H2 l! o6 s" e9 Q
- import pandas as pd
( c: n2 L+ q7 Z3 C2 o/ S - import numpy% \ p" q l# D; t- G) o; A$ e, T
- import ydcv6 P! z. E+ K: s, N8 i( w0 a
- import sys
6 l" t9 w$ t/ |6 A - sys.path.append('./mdictlib')8 I8 T. S' g& W3 H
- from mdict_query import IndexBuilder
/ M* R0 E% _, ^4 A - builder = IndexBuilder('./Collins.mdx')& j+ b3 B8 s. E" {' }: K
# {1 p" j4 n8 P+ k- Q3 Z/ |- def has_explains(result):1 f' `. @3 ]5 w' O
- return ('basic' in result) and ('explains' in result['basic'])
6 K* h8 F- }0 G7 ?+ ~ W. D) ] - $ O3 }8 b9 H; ^& q' Z4 V
- def get_explian_from_result(result):
/ }/ }8 i4 ^* d& ?2 Z - if not has_explains(result):
8 i) m2 c. @5 }) `% ^, `$ J - return ''
" `7 Z$ }( I5 L+ q2 i" S" m/ [ - return ';'.join(result['basic']['explains'])4 r* o' H1 o0 j! w
- ) T; x* g0 o$ C7 i7 p6 h
- def translate_from_yd(word):) w9 R. @4 m$ E5 @+ w2 q
- result = ydcv.lookup_word_inner(word)
# V/ ~: U# N3 q+ F' {6 K, k - return result" q2 T; s; F# c2 w, U
! R" v% w; e; w n- def if_in_collins(word):
+ E. c/ F6 v& L6 j( E. w) _ - return len(builder.mdx_lookup(word)) > 00 h) o2 ]1 c4 W7 c4 {2 Y1 a
: V. c. k! B; E S. _7 z- df1 = pd.read_csv('./2018.12.20-wordbook-neat.txt',names=['worlds']) j a X% D/ s5 Z4 P* \7 G
- df1 = df1.sort_values(by = 'worlds')
, i2 p, N3 Y4 |$ S" C8 y - df1['yd_explain'] = df1['worlds'].apply(lambda x :translate_from_yd(x))
8 G5 B9 A- ~3 h: D3 }, r$ x$ [ - df1['expalins'] = df1['yd_explain'].apply(get_explian_from_result)
. {; r+ ^9 A$ R5 y1 h - origin_word = df1['expalins'].str.extractall(r'[(\(]([a-z]+)的.*[)\)]').unstack()
2 n3 @' Q; ~- s$ C& |9 ]& W7 _ - df2 = df1.copy()
$ k3 F% ?: e0 l, w: I3 P - df2.loc[list(origin_word[0].index)] = origin_word[0]8 J) n' Z8 [- K; b' z
- df2 = df2.reindex(columns=['worlds','expalins'])
. O }# M+ @" }- t/ N - df2 = df2.drop_duplicates('worlds'), a9 f0 a. L! n, ]! n1 T! g
- df_not_in_collins = df2[df2['worlds'].apply(lambda x: if_in_collins(x))]4 q! z8 b, y$ K+ S F4 a
- ) D1 U' D, o0 P2 c7 J
- df1.to_json('./words_queried_by_youdao.json'): e5 m: z2 _& T$ C+ Y+ Y2 j
- df_not_in_collins.to_csv('./df_not_in_collins.csv'); V- ^1 ]5 x, A* o$ |
- 1 O3 Y6 B$ b% `: W- g
- df_not_in_collins['worlds'].to_csv('./neat_word_list.csv')
9 g. u; t% M" J" j4 q4 R3 m4 @
复制代码 然后运行,就可以看到清洗过的单词啦。8 N: ^7 f9 v# g, |
9 R1 h4 M0 x" \+ i9 G* _
PS:这个工具需要有些依赖解决,有一定python基础的可以通过看导入的模块来猜出依赖。没有基础的不要着急,我有时间整理好后会放到github上,给小伙伴们提供使用。
7 a( _5 L& ^5 V: `3 \( Q# r除了依赖以外,需要自己有一个用于排除无效词的mdx文件,这里我用的是柯林斯词典。
9 O E3 Q3 \% j/ V& f5 e+ o$ V0 D" m
So,enjoy
[1 l. s+ H" P/ o8 Q
8 ]& O0 \) ^& \======================================================================% z+ w Q+ c/ C( t1 L) O
2 E" {0 r. y5 \$ B: gupdae6 B# F2 g/ `5 i: A* ~
好像有朋友再尝试代码的时候遇到些问题,我深知调试别人代码是多么恶心的事情,为了节省各位的时间抽时间整理了一下代码放到了git hub上:
# ]: _/ R5 E& I1 L6 A2 o参见: https://github.com/zam5607822/word_book1 E) e2 M O$ D7 C
3 f p9 ]% D" R5 R% f ~几点说明:
% \0 S7 P$ T/ p" L3 Y' {1,由于我自己的环境是基于jupyter,所以也上传了ipynb文件,大家有喜欢用jupyter的也可以用这个。不使用jupyter的,直接使用wordbook.py即可。5 B6 ]# W/ B4 ~6 }- \4 m
2,为了方便大家,增加了依赖说明文件:requirements.txt ,各位在第一次运行代码的时候,使用 pip install -r requirements.txt 安装一下依赖即可
6 {: \. t2 h5 i \) Q3,为了方便大家测试,准备了一个示例生词本:2018.12.20-wordbook-neat.txt可以替换成你的" g& f8 @6 ?9 W" ~1 a3 M7 s8 N
4, 同样也上传了一个默认词典文件:Collins.mdx 2 J6 }& Q7 Y- t9 I" d5 r
5, 有道词典的接口是需要一个token的,获取的方法可以自行百度,我的token被我隐藏掉了。自己获取到token后,替换掉ydcv.py文件中的28,29行 换成你的token。
- k+ f9 ~+ h9 B8 E5 l* x* p2 N
' i9 X/ q6 G5 Y9 |2 M& E. Z# v R! P; benjoy
f$ Q( J( M! a* Y# q. ` |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
3
查看全部评分
-
|