開源一個java寫的英語工具 (JavaFx)

簡介

看過我的文章應該知道,我喜歡寫一些實際的東西,這裏來介紹一個簡單的英語工具。這個工具由英譯漢、英譯英部分和英語闖關識記兩大部分構成。

這個工具的語言爲Java,使用的GUI框架爲JavaFx,如果不會沒關係,只要掌握了方法,你也可以用你習慣的語言、框架實現。

翻譯功能展示和闖關功能展示:
在這裏插入圖片描述

配合闖關功能識記單詞:

在這裏插入圖片描述

獲取及使用方法、軟件自定義

github開源地址

如果想直接使用,你也可以下載我上傳到CSDN的資源,我儘量定的最低積分(0積分): 資源下載

一個幫助英語學習的工具。

使用方法:

Alt + Q: 喚出\後置單詞查詢窗口

Alt + Z: 退出程序

Alt + A: 單詞檢驗窗口

Alt + X: 退出單詞檢驗

Alt + C: 簡易記事本

原理及自定義:

  1. 查詢的單詞來源有兩個:
  • 英漢 a.txt
  • 英英 dict.txt

可以通過修改相應文件,修改查詢結果

查詢方式爲java的Contain。

  1. 查詢單詞的讀音和句子意思時:

用到的爲有道http接口。

  1. 測試單詞有一個來源:
  • 英漢 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.gifREADME.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

  1. 當其中某個字符串長度爲0的時候,編輯距離就是另一個字符串的長度. (我們可以理解爲, 對長度爲0的字符串一直插入字符變成另一個字符串),邊界
  2. 當字符串不等的時候,我們從字串開頭開始看:
    那麼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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章