簡介
看過我的文章應該知道,我喜歡寫一些實際的東西,這裏來介紹一個簡單的英語工具。這個工具由英譯漢、英譯英部分和英語闖關識記兩大部分構成。
這個工具的語言爲Java,使用的GUI框架爲JavaFx,如果不會沒關係,只要掌握了方法,你也可以用你習慣的語言、框架實現。
翻譯功能展示和闖關功能展示:
配合闖關功能識記單詞:
獲取及使用方法、軟件自定義
如果想直接使用,你也可以下載我上傳到CSDN的資源,我儘量定的最低積分(0積分): 資源下載
一個幫助英語學習的工具。
使用方法:
Alt + Q: 喚出\後置單詞查詢窗口
Alt + Z: 退出程序
Alt + A: 單詞檢驗窗口
Alt + X: 退出單詞檢驗
Alt + 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!