0 申明

  • 英文词库项目来自 github、我fork了一下。
  • 词库文件是基于csv的词库文本文件,具体的可以去github主页去观看
  • 项目作者为这个csv文件编写了一个常见语言和数据库的处理接口

1 csv文件格式详解

完整的词库非常大 (222MB)UTF-8编码 请勿用excel打开 词库采用了csv文件的格式来存储单词文件,使用者可以看得见,摸得着! 文本较大、是文本编辑器打开即可看到文件夹的格式。csv文件格式下去自行百度、csv类似于数据库和excel的格式!
下面是词库csv文件的具体格式 加?的是我在项目中没用到的或者我认为没啥用的

word	单词名称
phonetic	音标,以英语英标为主
definition	单词释义(英文),每行一个释义
translation	单词释义(中文),每行一个释义
pos	词语位置,用 "/" 分割不同位置  这个字段我看貌似没啥意思 ?
collins	柯林斯星级 ?
oxford	是否是牛津三千核心词汇 ?
tag	字符串标签:zk/中考,gk/高考,cet4/四级  等等标签,空格分割
bnc	英国国家语料库词频顺序 ?
frq	当代语料库词频顺序 ?
exchange	时态复数等变换,使用 "/" 分割不同项目,见后面表格
detail	json 扩展信息,字典形式保存例句(待添加) 这个在csv为空
audio	读音音频 url (待添加) 这个在csv为空

可以看到项目中词库内容是很全面的
中文释义应该说非常的全面、核心的常见单词其英文释义基本上都有 上述的csv文件还包含短语,缺少英文的例句和发音

例句除了使用爬虫爬取、在线API(如有道在线API…)外我没有发现有啥其他的好办法。 单词发音的这个问题很好解决 参见这个博客的在线发音API接口 https://blog.csdn.net/xj853663557/article/details/82735900
在这里插入图片描述
重点讲一下音频的获取,以上图的链接接口为例
https://ssl.gstatic.com/dictionary/static/sounds/oxford/somewords–_gb_1.mp3
替换链接的somewords为需要的单词 注意:1 全小写 2 不支持空格 使用的2种方法

  1. 在线音频的获取
    在android端测试时、 我是用MediaPlayer实现的在线播发,效果非常的好
    贴出源代码:
package cn.adminzero.helloword.util;

import android.media.MediaPlayer;
import android.text.TextUtils;
import android.util.Log;

/**
 * author : zhaojunchen
 * date   : 2019/11/1811:43
 * desc   : https://blog.csdn.net/xj853663557/article/details/82735900 src detail
 * 音频播放器类
 * 多线程适用-->在子线程播放音频  避免卡死
 * MediaPlayUtil player = new MediaPlayUtil();
 * player.playword(String word); // 播放单词
 */
public class MediaPlayUtil {
    // 音频链接获取
    private static final String TAG = "MediaPlayUtil";
    private MediaPlayer mediaPlayer = null;

    private static String getUrl(String word) {
        return "https://ssl.gstatic.com/dictionary/static/sounds/oxford/" + word + "--_gb_1.mp3";
    }

    public MediaPlayUtil() {
        mediaPlayer = new MediaPlayer();
    }

    // 单词发音
    public boolean playword(String word) {
        if (TextUtils.isEmpty(word)) {
            Log.d(TAG, "playword: " + "单词确缺失");
            return false;
        }
        final String url = getUrl(word.trim().toLowerCase());
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                }
                mediaPlayer.reset();
                try {
                    mediaPlayer.setDataSource(url);
                    mediaPlayer.prepare();
                    mediaPlayer.start();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        return true;
    }
}

使用方法
MediaPlayUtil mediaPlayUtil = new MediaPlayUtil(); 
mediaPlayUtil.play("yes");
mediaPlayUtil.play("no");

  1. 下载离线的音频MP3
    下载方法: 不许使用爬虫 、 使用linux 的wget即可
    详细介绍 首先拿到待下载单词的拼写、替换掉链接的somewords、得到新的连接,将连接批量的写到文本文件(一行一个链接) 使用
wget -i url.txt -P  ./downloadpath   -i 指定url集合的文件 -P指定下载文件夹

2 csv文件解析

  1. 实现快速解析,需要干掉逗号! 在csv文件里面 字符串里面是可能存在逗号的,这个和分隔符是冲突的 所以会在字符串加上" xxxxx,xxxxx" 区分逗号 如何识别分号包包装的逗号和作为分割的都号?

首选替换逗号为一个不出现的字符一个在csv文件里面的字符 (这里面我是用的#) 对文件预处理、替换逗号

    /**
     * 对开源词库预处理
     * 输入  原文件路径 --> 目的文件路径 
     */
    public static void preparecsv(String filename, String filename_des) throws Exception {
        File csv = new File(filename); // CSV文件路径
        FileWriter fw = new FileWriter(filename_des);
        BufferedReader br = new BufferedReader(new FileReader(csv));
        StringBuffer stringBuffer = new StringBuffer();
        StringBuffer temp = new StringBuffer();
        String line = null;
        String tempstring = null;
        String[] tempbuffer;
        String splitstring = Character.toString(splitsymbol);
        char ch;
        int i, isclose;
        long count = 1;

        //* 添加正确的分隔符和id标识*//*
        try {
            while ((line = br.readLine()) != null) {
                line = String.valueOf(count) + "," + line;
                count++;
                isclose = 0;
                temp.setLength(0);
                for (i = 0; i < line.length(); i++) {
                    ch = line.charAt(i);
                    if (ch == '"') {
                        isclose = (isclose + 1) % 2;
                    } else if (ch == ',' && isclose == 0) {
                        ch = splitsymbol;
                        temp.append(ch);
                    } else if (ch == splitsymbol) {
                    } else {
                        temp.append(ch);
                    }
                }
                /**
                 * 舍弃短语
                 * */
                tempstring = temp.toString();
                tempbuffer = tempstring.split(splitstring, -1);
                if (tempbuffer.length != 14) {
                    System.out.println("error");
                    continue;
                }
                tempstring = tempbuffer[1].trim();
                if (tempstring.contains(" ")) {
                    continue;
                }
                temp.append("\n");
                stringBuffer.append(temp);
            }
            fw.write(stringBuffer.toString());
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

下面的代码使用tag字段的值筛选出来zk gk cet4 cet6 … 到新的文件
其他的处理使用相同的模板类型模板

   public static void wordall(String A, String B) throws Exception {
        File file = new File(A); // CSV文件路径
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line = null;
        StringBuffer stringBuffer = new StringBuffer();
        int position = 8; //单词类型在csv的位置
        int count = 0;
        String[] buffer;
        String splitstring = Character.toString(splitsymbol);
        String buffer0, buffer1, buffer2, buffer3, buffer4, buffer8, buffer11;

        /**
         * wordid,word,phonetic,definition,translation,pos,
         * collins,oxford,tag,bnc,frq,
         * exchange,detail,audio
         * 0 1 2 3 4 11 8 (tag)
         */
        short tag = 0;
        StringBuffer onlyword = new StringBuffer();
        try {
            onlyword.setLength(0);
            while ((line = br.readLine()) != null) {
                buffer = line.split(splitstring, -1);
                buffer8 = buffer[position].trim();
                tag = 0;
                if (buffer8.contains("zk")) {
                    tag |= tag_zk;
                }
                if (buffer8.contains("gk")) {
                    tag |= tag_gk;
                }
                if (buffer8.contains("cet4")) {
                    tag |= tag_cet4;
                }
                if (buffer8.contains("cet6")) {
                    tag |= tag_cet6;
                }
                if (buffer8.contains("toefl")) {
                    tag |= tag_toefl;
                }
                if (buffer8.contains("ielts")) {
                    tag |= tag_ielts;
                }
                if (buffer8.contains("gre")) {
                    tag |= tag_gre;
                }
                if (buffer8.contains("ky")) {
                    tag |= tag_ky;
                }
                if (tag == 0) {
                    continue;
                }
                count++;
                //buffer0 = buffer[0].trim() + splitstring;
                buffer0 = String.valueOf(count) + splitstring;
                buffer1 = buffer[1].trim() + splitstring;
                buffer2 = buffer[2].trim() + splitstring;
                buffer3 = buffer[3].trim() + splitstring;
                buffer4 = buffer[4].trim() + splitstring;
                buffer11 = buffer[11].trim() + splitstring;
                stringBuffer.append(buffer0);
                stringBuffer.append(buffer1);
                stringBuffer.append(buffer2);
                stringBuffer.append(buffer3);
                stringBuffer.append(buffer4);
                stringBuffer.append(buffer11);
                stringBuffer.append(String.valueOf(tag) + "\n");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        FileWriter fw = new FileWriter(B);
        fw.write(stringBuffer.toString());
        fw.close();
        System.out.println(B + " items is " + count);
    }

源代码地址 : csvanalyze

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐