【问题标题】:How to find if a string contains a word from a dictionary? [duplicate]如何查找字符串是否包含字典中的单词? [复制]
【发布时间】:2020-03-16 15:10:03
【问题描述】:

我需要找出一个字符串,该字符串是通过删除两个单词之间的空格而构成的,其中包含字典中的一个单词。

我已经存储在 BST 中的字典中。

我得到一个删除了随机空格的文本文件作为输入。 例如:

我们离开的时间非常好,在nightfallto克劳森堡之后来到。 在这里,我在皇家酒店住了一晚。我吃过晚饭,或者 相当晚饭,一只用红辣椒做的鸡肉,这是 非常好但是口渴。 (Mem.,获取 Mina 的食谱。)我问 服务员,他说它叫“辣椒粉亨德尔”,因为它是 nationaldish,我应该可以在任何地方买到它 喀尔巴阡山脉。我发现我的一点德语在这里非常有用;确实,我 不知道没有它我应该怎么过。

我阅读了文件并将每个单词保存在一个列表中。 我需要验证一个单词是否在字典中并计算它的频率,我已经做了这部分。困难的部分是我需要验证我是否可以从删除空格的字符串中获取字典中的单词。

例如, 'goodbut' 应该给我 'good' 并且应该添加到频率计数器中。因为“但是”不在我的字典里。

当我查找频率时,我有一个列表,其中包含文本文件中不在字典中的所有字符串。我需要仔细阅读这些词,看看我是否能从中得到一个合法的词。

但我不知道怎么做。也不从哪里开始

【问题讨论】:

  • 但我不知道怎么做。也不从哪里开始首先发布您的代码并指出您需要帮助的部分。
  • 欢迎堆栈溢出!为了让我们帮助您,如果您能提供您期望的输出示例,那将是非常有益的。如果可能,还要尝试提供更具可读性的输入。最后,您是否尝试过任何我们可以帮助您的方法?
  • 这与我多年前提出的一个问题非常相似:stackoverflow.com/questions/5922956/java-dictionary-searcher 您需要拆分不在找到的字符串集中的字符串(或者更聪明并应用一种后续方法) .
  • 复合词,比如“人行道”呢?这些词本身就是词,但由较小的词组成。

标签: java string


【解决方案1】:

对于文本中的每个单词:

Iterable<String>  words = ...;
for (String word : words) {
    processSubWords(word);
}

您想生成每个可能的子词(这只会发生在具有 2 个或更多字符的词中):

void processSubWords(String word) {
    if (word.length() > 1) {
        for (int i = 1; i < word.length(); i++) {
            final String left = word.substring(0, i);
            final String right = word.substring(i);
            lookupAndUpdate(left);
            lookupAndUpdate(right);
        }
    }
}

然后在lookupAndUpdate 中,您将进行字典查找并根据需要进行更新(如果有匹配项)。

例如,如果您将goodbut 传递给processSubWords,它将使用以下字符串调用lookupAndUpdate

g
oodbut
go
odbut
goo
dbut
good
but
goodb
ut
goodbu
t

其中,只有 good 应该(可能)与您的字典匹配。

【讨论】:

  • “oo”、“dbu”、“odbu”等呢?这些不是“子词”吗?
  • 不符合定义。从问题的描述中只删除了一个空格。所以你必须重新插入它。没有将“goodbut”变成“oo”和另一个子字符串的单个空格插入。您需要插入两个空格。
【解决方案2】:

我认为带有计数器的正则表达式匹配器应该可以达到预期的效果。示例代码将是这样的:

public int countWords(String key, String source) {      
    Pattern pattern = Pattern.compile(key);
    Matcher matcher = pattern.matcher(source);

    int count = 0;
    while (matcher.find()) {
        count++;
    }
    return count;
}

其中关键是您的示例中的“好”一词,来源是文本。该方法为此设置返回计数 2。

【讨论】:

  • 他的例子不包含“好”这个词。它包含“goodbut”。
  • 匹配器得到“good”(文本中的第 5 个单词)和粗体的“goodbut”(空格删除字符串)。没有其他匹配项,频率计数器为 2。
  • 我认为你没有理解他的问题。他如何确定“goodbut”是否由字典单词组成?
  • 他在字典里有不同的词(他说他已经提取出来了),我们假设(因为那个人已经不在了)字典里有“好”这个词,他需要找到文本中的单词即使删除了空格 - “good but” -> “goodbut”。这里我们使用正则表达式来匹配这些示例。正则表达式匹配“good”(与 hte 关键字的 1 比 1 相似性)和“goodbut”(关键字,但删除了下一个单词的空格)。剩下的就是遍历字典,调用这个方法。
  • 这并不能解决问题。
猜你喜欢
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多