Make emoji suggestions less aggressive

This commit is contained in:
Aleksandras Kostarevas 2024-03-14 15:17:55 -05:00
parent cd8499f742
commit 65686b39a0

View File

@ -70,6 +70,40 @@ private fun SuggestedWordInfo.add(other: SuggestedWordInfo): SuggestedWordInfo {
return result return result
} }
private fun levenshteinDistance(s1: String, s2: String): Int {
val len1 = s1.length
val len2 = s2.length
val dist = Array(len1 + 1) { IntArray(len2 + 1) }
for (i in 0..len1) {
dist[i][0] = i
}
for (j in 0..len2) {
dist[0][j] = j
}
for (j in 1..len2) {
for (i in 1..len1) {
val cost = if (s1[i - 1] == s2[j - 1]) 0 else 1
dist[i][j] = minOf(
dist[i - 1][j] + 1,
dist[i][j - 1] + 1,
dist[i - 1][j - 1] + cost
)
}
}
return dist[len1][len2]
}
private fun areWordsRoughlyEqual(word1: String, word2: String, threshold: Int): Boolean {
val distance = levenshteinDistance(word1, word2)
return distance <= threshold
}
public class LanguageModelFacilitator( public class LanguageModelFacilitator(
val context: Context, val context: Context,
val inputLogic: InputLogic, val inputLogic: InputLogic,
@ -239,10 +273,12 @@ public class LanguageModelFacilitator(
val bothAlgorithmsCameToSameConclusion = maxWordDict?.mWord == maxWord?.mWord val bothAlgorithmsCameToSameConclusion = maxWordDict?.mWord == maxWord?.mWord
var autocorrectWord: SuggestedWordInfo? = null
val filtered = mutableListOf<SuggestedWordInfo>() val filtered = mutableListOf<SuggestedWordInfo>()
if(bothAlgorithmsCameToSameConclusion && maxWord != null && maxWordDict != null){ if(bothAlgorithmsCameToSameConclusion && maxWord != null && maxWordDict != null){
// We can be pretty confident about autocorrecting this // We can be pretty confident about autocorrecting this
val clone = maxWord.add(maxWordDict) val clone = maxWord.add(maxWordDict)
autocorrectWord = clone
suggestionResults.add(clone) suggestionResults.add(clone)
filtered.add(maxWordDict) filtered.add(maxWordDict)
filtered.add(maxWord) filtered.add(maxWord)
@ -271,8 +307,11 @@ public class LanguageModelFacilitator(
if(values.composedData.mTypedWord.isNotEmpty() && shouldSuggestEmojis) { if(values.composedData.mTypedWord.isNotEmpty() && shouldSuggestEmojis) {
(getEmojiCandidate(values.composedData.mTypedWord) (getEmojiCandidate(values.composedData.mTypedWord)
?: maxWord?.let { getEmojiCandidate(it.mWord) } ?: autocorrectWord?.let {
?: maxWordDict?.let { getEmojiCandidate(it.mWord) })?.let { if(areWordsRoughlyEqual(autocorrectWord.mWord, values.composedData.mTypedWord, 2))
getEmojiCandidate(it.mWord)
else null
})?.let {
suggestionResults.add(it) suggestionResults.add(it)
} }
} }