FLUTTER - 检查一个字符串是否包含另一个字符串

4
我正在开发一款英语词汇学习应用。部分练习是书面测验,用户需要将法语单词翻译成英语或者反过来。
为了让检查更加精确,而不仅仅是“1”或“0”(TypedWord == expectedWord),我已经开始使用字符串相似性进行工作,这对于拼写错误等问题非常有效。
我也使用了contains函数,例如,如果用户在期望单词前面添加了一个冠词,它不会认为是错误的。(例如:预期单词为“Ecole(学校)”,但用户写成“A school”)。
所以我使用诸如“if (typedWord.contains(word)==true) then...”之类的代码行来检查,它对于冠词问题很有效。但它引起了另一个问题:
例如:A bough --> 预期的法语单词是“branche”。如果用户键入“une branche”,它会被视为正确,这很好。但是,如果用户键入“débrancher”(拔掉插头),它也会被视为正确,因为“branche”是“débrancher”的一部分......
有什么办法可以避免这种情况发生吗?还有其他方法可以解决这个问题吗?
我阅读了三个提议的答案,它们非常有趣。问题是有些单词是复合词......例如:厨房用具、园艺工具等......因此,我认为“空格”功能可能会有问题......
3个回答

2
在这种情况下,将整个答案用“空格”分开,然后与正确单词进行比较。
For an example:
User's answer: That is my school
Separate it with space, so that you will find an array of words:
that, is, my, school. 

然后将每个单词与您的单词进行比较。这将给出正确的答案。

Flutter代码如下:

  usersAnswer?.split(" ").forEach((word){
    if(word == correctAnswer) 
      print("this is a correct answer");
  });

很有趣。有些单词有多个单词...例如:"厨房电器"...然后用户可以输入"一个厨房电器"。 - SylvainJack
在这种情况下,您也可以将答案拆分为数组,并将每个答案与已回答的数组进行比较。如果您答案列表中的每个项目都存在于用户的答案列表中,则可以将其预测为正确答案。 - Gourango Sutradhar
让我们在聊天中继续这个讨论 - SylvainJack
1
typedWord!.split(" ").forEach((subAnswer) { if (subAnswer.toLowerCase() == word!.toLowerCase()) { _reussiteExo = Reussite.totale; } else if (removeAccents(subAnswer.toLowerCase()) == removeAccents(word.toLowerCase())) { _reussiteExo = Reussite.partielleAccent; } else if (removeAccents(subAnswer.toLowerCase()) .similarityTo(removeAccents(word.toLowerCase())) > 0.8) { _reussiteExo = Reussite.partielleOrth; } }); - SylvainJack
1
我使用Levenstein算法来解决这个问题。它似乎工作得相当不错。昨天遇到了一个新问题,我之前没有考虑到:单词的顺序;如果期望的答案是“园艺工具”,而用户回答“一个工具花园”...这实际上是法语母语者的典型错误(单词顺序不同),应该指出这个错误是由于单词顺序问题造成的...今天正在解决这个问题...并尝试结合所有错误:如果用户回答“A toul garden”-->两个错误:1个拼写错误和一个顺序错误... - SylvainJack
显示剩余9条评论

1
你可以通过空格将字符串拆分,然后检查生成的数组中是否包含你要查找的单词。
typedWord.split(' ').contains('debranche');

所以如果 typedWord 是 'une branche',split(' ') 会将其转换为数组:['une', 'branche']。 现在当您检查此数组是否包含 'branche' 时,它将检查确切的字符串 "branche" 是否存在,因为在这种情况下它存在并返回 true。
然而,如果是 'une debranche',则生成的数组将是:['une', 'debranche'],因为该数组没有与 'branche' 相等的值,因此它将返回 false。请记住,当您使用 split 将字符串转换为数组时,在数组上使用 contains 会检查是否存在与提供的值完全相同的项,而在字符串中,它会检查字符串的一部分是否与给定值匹配。

包含仍将与“débrancher”一词一起使用,因为它将其拆分为一个单词。 - Yanni TheDeveloper
1
@YanniTheDeveloper 对“débrancher”进行分割的结果将是一个长度为1的数组。然后通过在此数组上使用contains,它将检查这两个字符串是否完全相同。这不像在字符串上使用contains那样,如果部分匹配,则返回true。 - Ramin
哦,是的,我明白了。 - Yanni TheDeveloper
我编辑了我的问题结尾...因为有些词是复合词:比如“厨房电器”。 - SylvainJack

0
你可以在正确的单词前后检查空格,例如if (typedWord.contains(' '+word+' ')==true) then...,这样"débrancher"就会被标记为错误。不过这种方法比较严格:如果句子必须以某些标点符号结尾,那么它将无法通过此检查。你可能需要一些允许标点符号但不允许空格的RegExp。

这对于句子的第一个单词和最后一个单词不起作用。 - Gourango Sutradhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接