首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相似词查找器

相似词查找器
EN

Code Review用户
提问于 2021-02-24 21:47:12
回答 1查看 353关注 0票数 0

相似词查找器

我创造了一个类似的词查找器的乐趣。(word.txt是来自http://www.mieliestronk.com/corncob_lowercase.txt的单词)有什么方法可以让这个词更好或者更准确?

代码语言:javascript
复制
import java.util.*;
import java.io.*;
class Main {

    public static void print(String text, int times) {
        for (int i = 0; i < times; i++) {
            System.out.print(text);
        }

    }
    public static void println(String text, int times) {
        for (int i = 0; i < times; i++) {
            System.out.println(text);
        }

    }
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList();
        try {
            BufferedReader reader = new BufferedReader(new FileReader("word.txt"));
            

            String line = null;
            while ((line = reader.readLine()) != null) {
                arrayList.add(line);
            }
            println("Welcome to similar word finder. This program searches ​58100 different words for words that are similar to the word that you entered",1);
            print("Enter a word: ", 1);

            Scanner scanner = new Scanner(System.in);
            String checkWord = scanner.nextLine();
                        for (int i = 0; i < checkWord.length(); i++) {
                                // checks whether the character is not a letter
                                // if it is not a letter ,it will return false
                                if ((Character.isLetter(checkWord.charAt(i)) == false)) {
                                    println("Your word contains a not-unicode letter!",1);
                                    System.exit(1);
                                }
                        }
                        ArrayList<String> similarwords = new ArrayList<>();
                        print("How strict do you want the search to be? (1) Very Strict (2) Normal strict (3) Not very strict: ",1);
                        String strict = scanner.nextLine();
            //println(arrayList.toString(),1);
            int minus = 0;
                        if (strict == "1") {
                            minus = 1;
                        } else {
                            if (strict=="2") {
                                minus = 2;
                            } else {
                                if (strict=="3") {
                                    minus = 3;
                                
                                } else {
                                    minus =2;
                                }
                            }
                        }
            int timesRight = 0;
            int timesRight2 = 0;
            if (checkWord.length() > 3) {
                  timesRight2 = checkWord.length()-minus;
                                        println("Similar Words:", 1);
            } else {
                            if (checkWord.length() > 2) {
                                timesRight2=checkWord.length();
                            }else {
                                timesRight=2;
                            }
                  
            }
            checkWord = checkWord.trim();                
            try {
                  String[] letters = checkWord.split("");
                                
                  for (String word3 : arrayList) {
                                    
                        timesRight=0;
                        String[] letters2 = word3.split("");
                        int under = 0;
                        if (letters.length<=letters2.length) {
                                under = letters.length;
                        } else {
                                under = letters2.length;
                        }
                        for(int i = 0; i < under;i++) {
                                    
                                    if (letters2[i].equals(letters[i])) {
                                timesRight++;
                                                
                          } else {
                              if(i<letters2.length-2 && i<letters.length-2){
                                  if (letters2[i+1].equals(letters[i])) {
                                        timesRight++;
                                                        
                                                    
                                  }
                              }
                                                
                            }
                        } 

                        if (timesRight>timesRight2) {
                                                    if 
                                                    if (word3 != checkWord) {
                                                            //System.out.println(checkWord);
                                                        similarwords.add(word3);
                              println(word3 +" #" + similarwords.size() , 1);
                                                    }else {
                                                        println(word3 + " (search word)",1);
                                                    }
                                            
                        } else {
                                                    //println("x",1);
                                                }
                  }
                                    
                                    
            } catch (Exception e) {
                    System.err.println("Error!: " + e);
                                
            }
                           
                        
                                                      
                            

                    
                
                

            
            
        } catch (Exception e) {
            e.printStackTrace();
       }
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2021-02-25 10:30:40

如果你想要你的单词匹配更准确,查找Soundex匹配。

我致力于让你的代码更容易被普通人读懂。

我不知道你是怎么匹配单词的。我假设你是根据字母差异数来选择单词的。

通常,当您编写Java类时,它应该读起来像一篇文章。最重要的信息在开始时,随着代码的深入,您会看到越来越多的细节。我们称之为方法的一口大小的食物。

几乎所有的代码都在一个主要的方法中。您的代码对我来说很难理解,就像我说的,我放弃了试图理解您是如何比较单词的,而只是编写了我自己的代码。

下面是我写的查找类似单词的主要方法。

代码语言:javascript
复制
public void findSimilarWords() {
    List<String> wordList = readWordList();
    Scanner scanner = new Scanner(System.in);
    String checkword = readWord(scanner);
    int level = readStrictLevel(scanner);
    List<String> matchingWords = findMatchingWords(
            wordList, checkword, level);
    createOutput(checkword, matchingWords);
    scanner.close();
}

七行代码。现在,我们还不知道细节。我们知道有一个单词列表,我们从控制台得到一个单词和一个匹配级别,然后输出匹配的单词。在这一点上,这就是我们需要知道的。

我们将在进一步阅读类代码时获得详细信息。

我想我已经表达了自己的观点。这是修改后的代码。我希望您发现这段代码更容易理解,更重要的是,更容易修改。代码不仅仅是计算机的代码。人类也必须阅读和理解代码。包括时间过去之后的你。

代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class SimilarWordFinder {
    
    public static void main(String[] args) {
        SimilarWordFinder swf = new SimilarWordFinder();
        swf.findSimilarWords();
    }

    public void findSimilarWords() {
        List<String> wordList = readWordList();
        Scanner scanner = new Scanner(System.in);
        String checkword = readWord(scanner);
        int level = readStrictLevel(scanner);
        List<String> matchingWords = findMatchingWords(
                wordList, checkword, level);
        createOutput(checkword, matchingWords);
        scanner.close();
    }
    
    private List<String> readWordList() {
        List<String> wordList = new ArrayList<>();
        try {
            URL url = new URL("http://www.mieliestronk.com/"
                    + "corncob_lowercase.txt");
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(url.openStream()));
            String line = reader.readLine();
            while (line != null) {
                wordList.add(line.trim());
                line = reader.readLine();
            }
            reader.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return wordList;
    }
    
    private String readWord(Scanner scanner) {
        println("Welcome to similar word finder. This program "
                + "searches ​58,100 different words for words that "
                + "are similar to the word that you entered",
                1);
        boolean invalidWord = true;
        String checkWord  = "";
        
        while (invalidWord) {
            print("Enter a word: ", 1);
            checkWord = scanner.nextLine();
            invalidWord = false;
            for (int i = 0; i < checkWord.length(); i++) {
                // checks whether the character is not a letter
                // if it is not a letter ,it will return false
                if (!Character.isLetter(checkWord.charAt(i))) {
                    println("Your word contains a not-unicode letter!", 1);
                    invalidWord = true;
                    break;
                }
            }
        }
        
        return checkWord;
    }
    
    private int readStrictLevel(Scanner scanner) {
        print("How strict do you want the search to be? (1) Very "
                + "Strict (2) Normal strict (3) Not very strict: ",
                1);
        String strict = scanner.nextLine();
        return valueOf(strict);
    }
    
    private List<String> findMatchingWords(List<String> wordList,
            String word, int level) {
        List<String> similarWords = new ArrayList<>();
        
        for (String matchWord : wordList) {
            if (matchWord.length() == word.length()) {
                int difference = calculateWordDifference(word, matchWord);
                if (difference <= level) {
                    similarWords.add(matchWord);
                }
            }
        }
        
        return similarWords;
    }
    
    private int calculateWordDifference(String word, String matchWord) {
        int difference = 0;
        
        for (int i = 0; i < word.length(); i++) {
            if (word.charAt(i) != matchWord.charAt(i)) {
                difference++;
            }
        }
        
        return difference;
    }
    
    private void createOutput(String word, List<String> matchingWords) {
        println(" ", 1);
        println("The following words match \"" + word + "\"", 1);
        println(" ", 1);
        
        for (String matchingWord : matchingWords) {
            println("    " + matchingWord, 1);
        }
    }
    
    private void print(String text, int times) {
        for (int i = 0; i < times; i++) {
            System.out.print(text);
        }
    }

    private void println(String text, int times) {
        for (int i = 0; i < times; i++) {
            System.out.println(text);
        }
    }
    
    private int valueOf(String number) {
        try {
            return Integer.valueOf(number);
        } catch (NumberFormatException e) {
            return 2;
        }
    }
    
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/256421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档