简介
看过我的文章应该知道,我喜欢写一些实际的东西,这里来介绍一个简单的英语工具。这个工具由英译汉、英译英部分和英语闯关识记两大部分构成。
这个工具的语言为Java,使用的GUI框架为JavaFx,如果不会没关系,只要掌握了方法,你也可以用你习惯的语言、框架实现。
翻译功能展示和闯关功能展示:
配合闯关功能识记单词:
获取及使用方法、软件自定义
github开源地址:https://github.com/Iamttp/MyUtil
如果想直接使用,你也可以下载我上传到CSDN的资源,我尽量定的最低积分(0积分): https://download.csdn.net/download/qq_40515692/12280276
一个帮助英语学习的工具。
使用方法:
Ctrl + Q: 唤出\后置单词查询窗口
Ctrl + Z: 退出程序
Ctrl + A: 单词检验窗口
Ctrl + X: 退出单词检验
Ctrl + C: 简易记事本
原理及自定义:
- 查询的单词来源有两个:
- 英汉
a.txt
- 英英
dict.txt
可以通过修改相应文件,修改查询结果
查询方式为java的Contain。
- 查询单词的读音和句子意思时:
用到的为有道http接口。
- 测试单词有一个来源:
- 英汉
a.txt
和查询单词有相同的来源。
修改文件后,运行Pre文件夹的SortWord代码,生成单词相似度文件p___.txt
同组单词的选取方式为Levenshtein 距离
这样就完成自定义单词测试功能了。
源码介绍
文件介绍
com.melloware.jintellitype
里面的.dll文件 保存 jintellitype-1.3.9.jar
所需环境
Pre
存放软件使用前运行的程序。SortWord
会将单词文件的单词解析,得到和该单词最相近的三个单词。这样在单词测试时就可以有三个和单词最像的干扰选项了。
sample
存放主要代码。 Main
文件是JavaFx入口函数,调用了sample.xml
作为GUI的定义。MyRect
尚在测试,Note
文件是简易记事本实现文件,调用sample2.xml
作为GUI定义。Util
文件为一些通用的工具。Word
文件存放单词管理。sample.css
存放GUI格式定义,如隐藏滚动条等。
6.gif
、README.md
为帮助文件,a.txt
为英汉词典、dict.txt
为英英词典、pa.txt
为处理得到的相近单词词典。
单词查询部分
这部分可以参考我之前的文章:
https://blog.csdn.net/qq_40515692/article/details/104602531
单词测试部分
首先讲解SortWord
,它的任务就是保存单词的最相近3个单词。
处理前(a.txt):
处理后(pa.txt),保存相近单词行数(忽略空内容):
这里的核心自然是如何求两个单词的最小距离,刚好网上有一个叫做编辑距离的算法,这个算法竟然有动态规划的思想太炫了!这里参考了网上的一些解释:
编辑距离 (Levenshtein Distance算法)
字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。其中,字符操作包括:
删除一个字符 a) Insert a character
插入一个字符 b) Delete a character
修改一个字符 c) Replace a character
- 当其中某个字符串长度为0的时候,编辑距离就是另一个字符串的长度. (我们可以理解为, 对长度为0的字符串一直插入字符变成另一个字符串),边界
- 当字符串不等的时候,我们从字串开头开始看:
那么A[0] == B[0];的时候,dif[i][j] = dif[i - 1][j - 1]
而A[0] != B[0];的时候:
dif[i][j] = dif[i - 1][j - 1] + 1
——dif[i - 1][j - 1]
+修改当前字符相等1次操作dif[i][j] = dif[i][j - 1] + 1
——dif[i - 1][j - 1]
+前面添加一个相等字符1次操作dif[i][j] = dif[i - 1][j] + 1
—— 同上
所以代码就是:
public static float levenshtein(String str1, String str2) {
//计算两个字符串的长度。
int len1 = str1.length();
int len2 = str2.length();
//比字符长度大一个空间
int[][] dif = new int[len1 + 1][len2 + 1];
//赋初值,步骤B。
for (int a = 0; a <= len1; a++) {
dif[a][0] = a;
}
for (int a = 0; a <= len2; a++) {
dif[0][a] = a;
}
//计算两个字符是否一样,计算左上的值
int temp;
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
temp = 0;
} else {
temp = 1;
}
//取三个值中最小的
dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,
dif[i - 1][j] + 1);
}
}
//计算相似度
float similarity = 1 - (float) dif[len1][len2] / Math.max(str1.length(), str2.length());
return similarity;
}
//得到最小值
public static int min(int... is) {
int min = Integer.MAX_VALUE;
for (int i : is) {
if (min > i) {
min = i;
}
}
return min;
}
然后就是比较每个单词了,时间复杂度有点高是O(N*N*m*m)
,N表示词典里面的单词数,m表示单词平均长度,但是是提前处理得到文件的,所以不影响软件使用。
然后就是一些逻辑代码和GUI处理了,可以去github上查看,如果github网慢的话,欢迎评论留言,我把代码附上(主要担心文章太长吓到些人),其实相信自己,做一些小工具自己用完全没问题,Just do it!