【问题标题】:how to split a word into two words by adding a space between adjacent characters如何通过在相邻字符之间添加空格将一个单词分成两个单词
【发布时间】:2023-09-05 06:09:02
【问题描述】:

我正在尝试获取单词:missspelling,并通过在相邻字符之间添加“”(空格)将单词分成两个单词,并且想要获取单词:miss spelling 结果。任何指导都会有所帮助,尝试了不同的代码,但没有看到结果。

适用于其他建议的代码仅供参考。 *请注意,注释掉的代码是我一直在搞乱的尝试并获得正确的结果。

    /**
     * Returns possible suggestions for misspelled word
     * 
     * @param tree The Trie that will be checked
     * @param word The word in trie that is checked
     */
    public static void suggest(TrieNode tree, String word) {
        Set<String> result = new HashSet<>();
        System.out.println("Suggestions: ");
        // Remove a character
        for (int i = 0; i < word.length(); ++i)
            result.add(word.substring(0, i) + word.substring(i + 1));
        // Swap two consecutive characters
        for (int i = 0; i < word.length() - 1; ++i)
            result.add(word.substring(0, i) + word.substring(i + 1, i + 2) + word.substring(i, i + 1)
                    + word.substring(i + 2));
        // Replace a character with other
        for (int i = 0; i < word.length(); ++i)
            for (char c = 'a'; c <= 'z'; ++c)
                result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i + 1));
        // Add a new character
        for (int i = 0; i <= word.length(); ++i)
            for (char c = 'a'; c <= 'z'; ++c)
                result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i));
        // Split word into pair of words by adding a " " between adjacent pairs
        // Need help here
        for (int i = 0; i < word.length(); ++i)
            for (char c = ' '; c <= ' '; ++c)
                if (search(tree, word.substring(0, i)) && search(tree, word.substring(i)) == true)
                     result.add(word.substring(0, i) + String.valueOf(c) + word.substring(i));


        ArrayList<String> res = new ArrayList<>(result);
        int j = 0;
        for (int i = 0; i < result.size(); i++)
            if (search(tree, res.get(i))) {
                if (j == 0)
                    System.out.print("[");
                System.out.print(res.get(i) + ",");
                System.out.print("");
                j++;
            }
         System.out.print("]" + "\n");
    }

【问题讨论】:

  • 我今天在网站上看到了你之前的问题,和这个一模一样。虽然这个措辞更好,但您应该至少等待 48 小时才能重新发布。
  • @BenjaminLowry,好的
  • @BenjaminLowry 我不认为你应该重新发布,这就是 imo 的赏金。如果您可以更好地措辞,您应该编辑原文。
  • 好的,你如何确定你想把“拼写错误”这个词分成拼写错误,而不是拼写错误或拼写错误?
  • @GilbertLeBlanc,我想通过在相邻字符之间添加空格然后使用 if 语句检查字典以查看每个拆分单词是否都在字典中来打破单词。我已经用应该可以工作但没有打印出来的代码替换了杂乱无章的代码(可能缺少某些东西)。

标签: java spell-checking trie


【解决方案1】:

我编写了一个最小的、可运行的代码,如果在字典中找到两个单词,它会拆分单词。

这是我的测试结果

miss spelling
apple

这是代码。重要的方法是 splitWord 方法。

package com.ggl.testing;

import java.util.ArrayList;
import java.util.List;

public class DoubleWord implements Runnable {

    public static void main(String[] args) {
        new DoubleWord().run();
    }

    @Override
    public void run() {
        Dictionary dictionary = new Dictionary();
        System.out.println(splitWord("missspelling", dictionary));
        System.out.println(splitWord("apple", dictionary));
    }

    public String splitWord(String word, Dictionary dictionary) {
        for (int index = 1; index < word.length(); index++) {
            String prefix = word.substring(0, index);
            if (dictionary.isWordInDictionary(prefix)) {
                String suffix = word.substring(index);
                if (dictionary.isWordInDictionary(suffix)) {
                    return prefix + " " + suffix;
                }
            }
        }

        return word;
    }

    public class Dictionary {
        private List<String> words;

        public Dictionary() {
            this.words = setWords();
        }

        public boolean isWordInDictionary(String word) {
            return words.contains(word);
        }

        private List<String> setWords() {
            List<String> words = new ArrayList<>();
            words.add("apple");
            words.add("miss");
            words.add("spelling");
            words.add("zebra");

            return words;
        }
    }

}

【讨论】:

  • 这段代码符合我的要求,我会将其标记为答案。我还没有弄清楚为什么我的代码没有将建议的单词添加到建议的输出列表中。
【解决方案2】:

首先有几件事......

这条线太疯狂了:

for (char c = ' '; c <= ' '; ++c)

它将只迭代一次,相当于:

char c = ' ';

您正在重新发明*,尝试通过交换字符然后替换字符来查找有效单词:阅读Levenshtein distance,实施该算法,然后根据输入的 Levenshtein 距离对字典进行排序以找到“最佳匹配” , 应该通过最大 Levenshtein 距离进行过滤 - 也许 3 是一个很好的起点(测试您的代码并查看结果是否合理)。


你的TrieNode 应该有一个search() 方法,而不是你的search() 方法接受一个trie 和一个单词,但这更多是设计问题,并不是你最大的问题。


那么,关于您的实际问题,尝试拆分输入很复杂,但“答案”是:

循环遍历输入中字母之间的所有位置,并将每个“一半”与您的输入进行相同的处理,除了您不应该进行嵌套拆分,将每一半的建议的每个组合组合起来,然后返回所有唯一建议组合的集合

但是,这样做会导致“非常多”的建议数量,因此无法扩展,因此您可能不应该这样做。

【讨论】:

    最近更新 更多