From ea466d7e5d80af200cd74554e53f56726dbc75c9 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Mon, 13 Jan 2025 10:30:00 +0700 Subject: [PATCH 1/7] change(web): adds auto-correct filter, requiring letter in existing text --- .../wordbreakers/src/main/default/index.ts | 12 ++- .../wordbreakers/src/main/index.ts | 3 +- .../worker-thread/src/main/predict-helpers.ts | 41 ++++++++ .../src/tests/mocha/cases/auto-correct.js | 94 ++++++++++++++----- 4 files changed, 126 insertions(+), 24 deletions(-) diff --git a/web/src/engine/predictive-text/wordbreakers/src/main/default/index.ts b/web/src/engine/predictive-text/wordbreakers/src/main/default/index.ts index 390ba9806a..580fe39a30 100644 --- a/web/src/engine/predictive-text/wordbreakers/src/main/default/index.ts +++ b/web/src/engine/predictive-text/wordbreakers/src/main/default/index.ts @@ -38,7 +38,7 @@ export interface DefaultWordBreakerOptions { * @see http://unicode.org/reports/tr29/#Word_Boundaries * @see https://github.com/eddieantonio/unicode-default-word-boundary/tree/v12.0.0 */ -export default function default_(text: string, options?: DefaultWordBreakerOptions): LexicalModelTypes.Span[] { + function default_(text: string, options?: DefaultWordBreakerOptions): LexicalModelTypes.Span[] { let boundaries = findBoundaries(text, options); if (boundaries.length == 0) { return []; @@ -64,6 +64,16 @@ export default function default_(text: string, options?: DefaultWordBreakerOptio return spans; } +// Exposes `searchForProperty` for external use while associating it with this wordbreaker. +const def = Object.assign(default_, { + /** + * This method returns enum values corresponding to the character type as perceived by the wordbreaking algorithm. + */ + searchForProperty: searchForProperty +}); + +export default def; + /** * A span that does not cut out the substring until it absolutely has to! */ diff --git a/web/src/engine/predictive-text/wordbreakers/src/main/index.ts b/web/src/engine/predictive-text/wordbreakers/src/main/index.ts index 7f1682fca2..92976d91fd 100644 --- a/web/src/engine/predictive-text/wordbreakers/src/main/index.ts +++ b/web/src/engine/predictive-text/wordbreakers/src/main/index.ts @@ -1,5 +1,6 @@ import placeholder from "./placeholder.js"; import ascii from "./ascii.js"; import default_ from "./default/index.js"; +import { WordBreakProperty } from "./default/data.inc.js"; -export { placeholder, ascii, default_ as default, default_ as defaultWordbreaker }; \ No newline at end of file +export { placeholder, ascii, default_ as default, default_ as defaultWordbreaker, WordBreakProperty }; \ No newline at end of file diff --git a/web/src/engine/predictive-text/worker-thread/src/main/predict-helpers.ts b/web/src/engine/predictive-text/worker-thread/src/main/predict-helpers.ts index a0b687b9bf..3fdc83422c 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/predict-helpers.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/predict-helpers.ts @@ -6,6 +6,9 @@ import { ContextTracker, TrackedContextState } from './correction/context-tracke import { ExecutionTimer } from './correction/execution-timer.js'; import ModelCompositor from './model-compositor.js'; import { LexicalModelTypes } from '@keymanapp/common-types'; +import { defaultWordbreaker, WordBreakProperty } from '@keymanapp/models-wordbreakers'; +const searchForProperty = defaultWordbreaker.searchForProperty; + import Context = LexicalModelTypes.Context; import Distribution = LexicalModelTypes.Distribution; import Keep = LexicalModelTypes.Keep; @@ -590,6 +593,35 @@ export function processSimilarity( }); } +/** + * This function may be used to prevent auto-selection/auto-correct from applying in + * unexpected ways. For example, when typing numbers in English, we don't expect + * '5' to auto-correct to '5th' just because there are no pure-number entries in + * the lexicon rooted on '5'. + * @param correction + * @returns + */ +export function correctionValidForAutoSelect(correction: string) { + let chars = [...correction]; + + // If the _correction_ - the actual, existing text - does not include any letters, + // then predictions built upon it should not be considered valid for auto-correction. + for(let c of chars) { + // Found even one letter? We'll consider it valid. + switch(searchForProperty(c.codePointAt(0))) { + case WordBreakProperty.ALetter: + case WordBreakProperty.Hebrew_Letter: + case WordBreakProperty.Katakana: + return true; + default: + } + } + + // Only reached when the correction has nothing that passes as a letter in-context. + // (MidLet and MidNumLet only count when there are adjacent letters.) + return false; +} + export function predictionAutoSelect(suggestionDistribution: CorrectionPredictionTuple[]) { if(suggestionDistribution.length == 0) { return; @@ -608,6 +640,11 @@ export function predictionAutoSelect(suggestionDistribution: CorrectionPredictio suggestionDistribution = suggestionDistribution.slice(1); if(suggestionDistribution.length == 1) { + // Prevent auto-acceptance when the root doesn't meet validation criteria. + if(!correctionValidForAutoSelect(suggestionDistribution[0].correction.sample)) { + return; + } + // Mark for auto-acceptance; there are no alternatives. suggestionDistribution[0].prediction.sample.autoAccept = true; return; @@ -651,6 +688,10 @@ export function predictionAutoSelect(suggestionDistribution: CorrectionPredictio return; } + if(!correctionValidForAutoSelect(bestSuggestion.correction.sample)) { + return; + } + // compare correction-cost aspects? We disable if the base correction is lower than best, // but should we do other comparisons too? diff --git a/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/auto-correct.js b/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/auto-correct.js index d1e4d377a1..84bb8b412f 100644 --- a/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/auto-correct.js +++ b/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/auto-correct.js @@ -26,7 +26,7 @@ describe('predictionAutoSelect', () => { const predictions = [ { correction: { - sample: 'apple', // can be null / "mocked out" + sample: 'apple', p: 1 }, prediction: { @@ -52,6 +52,56 @@ describe('predictionAutoSelect', () => { assert.isOk(autoselected); }); + it(`does not select suggestions if the root correction has no letters`, () => { + /** + * @type {import('#./predict-helpers.js').CorrectionPredictionTuple[]} + */ + const predictions = [ + { + correction: { + sample: '5', + p: 1 + }, + prediction: { + sample: { + tag: 'keep', + transform: { + insert: '5', + deleteLeft: 0 + }, + matchesModel: false + }, + p: 0.01 + }, + totalProb: 0.01 + }, + { + correction: { + sample: '5', + p: 1 + }, + prediction: { + sample: { + transform: { + insert: '5th', + deleteLeft: 0 + }, + matchesModel: true + }, + p: 0.8 + }, + totalProb: 0.8 + } + ]; + + const originalPredictions = [].concat(predictions); + assert.doesNotThrow(() => predictionAutoSelect(predictions)); + assert.sameDeepOrderedMembers(predictions, originalPredictions); + + const autoselected = predictions.find((entry) => entry.prediction.sample.autoAccept); + assert.isNotOk(autoselected); + }); + it(`does not select solitary 'keep' suggestion that doesn't match the model`, () => { /** * @type {import('#./predict-helpers.js').CorrectionPredictionTuple[]} @@ -59,7 +109,7 @@ describe('predictionAutoSelect', () => { const predictions = [ { correction: { - sample: 'appl', // can be null / "mocked out" + sample: 'appl', p: 1 }, prediction: { @@ -91,7 +141,7 @@ describe('predictionAutoSelect', () => { */ const keepSuggestion = { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .8 }, prediction: { @@ -110,7 +160,7 @@ describe('predictionAutoSelect', () => { const highestNonKeepSuggestion = { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .8 }, prediction: { @@ -133,7 +183,7 @@ describe('predictionAutoSelect', () => { highestNonKeepSuggestion, { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .8 }, prediction: { @@ -149,7 +199,7 @@ describe('predictionAutoSelect', () => { }, { correction: { - sample: 'thic', // can be null / "mocked out" + sample: 'thic', p: .2 }, prediction: { @@ -181,7 +231,7 @@ describe('predictionAutoSelect', () => { */ const keepSuggestion = { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .8 }, prediction: { @@ -204,7 +254,7 @@ describe('predictionAutoSelect', () => { // Refer to AUTOSELECT_PROPORTION_THRESHOLD in predict-helpers.ts. const onlyNonKeepSuggestion = { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .8 }, prediction: { @@ -246,7 +296,7 @@ describe('predictionAutoSelect', () => { */ const keepSuggestion = { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .8 }, prediction: { @@ -269,7 +319,7 @@ describe('predictionAutoSelect', () => { // Refer to AUTOSELECT_PROPORTION_THRESHOLD in predict-helpers.ts. const highestNonKeepSuggestion = { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .8 }, prediction: { @@ -292,7 +342,7 @@ describe('predictionAutoSelect', () => { highestNonKeepSuggestion, { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .8 }, prediction: { @@ -308,7 +358,7 @@ describe('predictionAutoSelect', () => { }, { correction: { - sample: 'thic', // can be null / "mocked out" + sample: 'thic', p: .2 }, prediction: { @@ -343,7 +393,7 @@ describe('predictionAutoSelect', () => { */ const keepSuggestion = { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .8 }, prediction: { @@ -362,7 +412,7 @@ describe('predictionAutoSelect', () => { const highestNonKeepSuggestion = { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .9 }, prediction: { @@ -385,7 +435,7 @@ describe('predictionAutoSelect', () => { highestNonKeepSuggestion, { correction: { - sample: 'thin', // can be null / "mocked out" + sample: 'thin', p: .9 }, prediction: { @@ -401,7 +451,7 @@ describe('predictionAutoSelect', () => { }, { correction: { - sample: 'thic', // can be null / "mocked out" + sample: 'thic', p: .1 }, prediction: { @@ -436,7 +486,7 @@ describe('predictionAutoSelect', () => { */ const keepSuggestion = { correction: { - sample: 'cant', // can be null / "mocked out" + sample: 'cant', p: 1 }, prediction: { @@ -456,7 +506,7 @@ describe('predictionAutoSelect', () => { const expectedSuggestion = { correction: { - sample: 'cant', // can be null / "mocked out" + sample: 'cant', p: 1 }, prediction: { @@ -480,7 +530,7 @@ describe('predictionAutoSelect', () => { expectedSuggestion, { correction: { - sample: 'cant', // can be null / "mocked out" + sample: 'cant', p: 1 }, prediction: { @@ -515,7 +565,7 @@ describe('predictionAutoSelect', () => { */ const keepSuggestion = { correction: { - sample: 'thi', // can be null / "mocked out" + sample: 'thi', p: .7 }, prediction: { @@ -534,7 +584,7 @@ describe('predictionAutoSelect', () => { const highestCorrectionSuggestion = { correction: { - sample: 'thi', // can be null / "mocked out" + sample: 'thi', p: .7 }, prediction: { @@ -551,7 +601,7 @@ describe('predictionAutoSelect', () => { const highestNonKeepSuggestion = { correction: { - sample: 'the', // can be null / "mocked out" + sample: 'the', p: .3 }, prediction: { From 8eb5fc3b68b5f0a53aa7a2916f0d4e22fcccd767 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 15 Jan 2025 08:30:55 +0700 Subject: [PATCH 2/7] chore: seed epic/autocorrect --- web/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/README.md b/web/README.md index 7f7415c698..05f9432c20 100644 --- a/web/README.md +++ b/web/README.md @@ -1,5 +1,5 @@ # Keyman Engine for Web -The Original Code is (C) SIL International +The Original Code is (C) SIL Global ## Prerequisites See [build configuration](../docs/build/index.md) for details on how to From b299cecaafc5f8f9b0b35ad6bb36a081c333508c Mon Sep 17 00:00:00 2001 From: "Joshua A. Horton" Date: Wed, 15 Jan 2025 12:02:02 +0700 Subject: [PATCH 3/7] change(web): re-enable autocorrect in Web --- web/src/engine/main/src/headless/languageProcessor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/engine/main/src/headless/languageProcessor.ts b/web/src/engine/main/src/headless/languageProcessor.ts index 82c9a0392c..866d3607bf 100644 --- a/web/src/engine/main/src/headless/languageProcessor.ts +++ b/web/src/engine/main/src/headless/languageProcessor.ts @@ -21,7 +21,7 @@ export class LanguageProcessor extends EventEmitter { private _mayPredict: boolean = true; private _mayCorrect: boolean = true; - private _mayAutoCorrect: boolean = false; // initialized to false - #12767 + private _mayAutoCorrect: boolean = true; private _state: StateChangeEnum = 'inactive'; From bd09450d6943f6d8356592039c3e0c530aa7e7a8 Mon Sep 17 00:00:00 2001 From: "Joshua A. Horton" Date: Wed, 15 Jan 2025 12:05:43 +0700 Subject: [PATCH 4/7] chore: Revert "Merge pull request #12791 from keymanapp/fix/android/disable-auto-correct" This reverts commit 30ed4b8d7ff0ad03243b171a544470e88ced172f, reversing changes made to a420e7c49e27e294b3fe2631666946d9993a2124. --- .../kmapro/LanguageSettingsActivity.java | 4 ++-- .../layout/language_settings_list_layout.xml | 5 ++--- .../help/android_images/disable-suggestions.png | Bin 15434 -> 0 bytes android/docs/help/basic/using-the-banner.md | 12 ------------ 4 files changed, 4 insertions(+), 17 deletions(-) delete mode 100644 android/docs/help/android_images/disable-suggestions.png diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguageSettingsActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguageSettingsActivity.java index 96abc83f8a..977489f40a 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguageSettingsActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/LanguageSettingsActivity.java @@ -108,11 +108,11 @@ public final class LanguageSettingsActivity extends AppCompatActivity { RadioGroup radioGroup = (RadioGroup) findViewById(R.id.suggestion_radio_group); radioGroup.clearCheck(); - // Auto-correct disabled for Keyman 18.0 #12767 int[] RadioButtonArray = { R.id.suggestion_radio_0, R.id.suggestion_radio_1, - R.id.suggestion_radio_2}; + R.id.suggestion_radio_2, + R.id.suggestion_radio_3}; RadioButton radioButton = (RadioButton)radioGroup.findViewById(RadioButtonArray[maySuggest]); radioButton.setChecked(true); diff --git a/android/KMEA/app/src/main/res/layout/language_settings_list_layout.xml b/android/KMEA/app/src/main/res/layout/language_settings_list_layout.xml index 42ae9b1511..6399987b04 100644 --- a/android/KMEA/app/src/main/res/layout/language_settings_list_layout.xml +++ b/android/KMEA/app/src/main/res/layout/language_settings_list_layout.xml @@ -90,13 +90,12 @@ android:layout_gravity="center_vertical" android:text="@string/suggestions_radio_2" /> - - + android:text="@string/suggestions_radio_3" /> diff --git a/android/docs/help/android_images/disable-suggestions.png b/android/docs/help/android_images/disable-suggestions.png deleted file mode 100644 index a4a21b98cb5d277509ebbb21bf92141ead7d7048..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15434 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�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 (select an installed language) - -At the bottom of the language settings menu are three controls for the banner: - -![](../android_images/disable-suggestions.png) - -* Disable suggestions (Display image banner instead) -* Predictions only (Suggestion banner displays predictions) -* Predictions with corrections (Suggestion banner displays predictions and corrections) - ## Using the Suggestion Banner If a [dictionary is installed](installing-dictionaries) and enabled for the active Keyman keyboard, the banner will display suggestions that can be selected. From 2014f715c14145218dfa364370c67ab3afa48d43 Mon Sep 17 00:00:00 2001 From: "Joshua A. Horton" Date: Wed, 15 Jan 2025 12:22:44 +0700 Subject: [PATCH 5/7] fix(android): restores Android help changes previously lumped-in with auto-correct disable --- .../help/android_images/disable-suggestions.png | Bin 0 -> 15434 bytes android/docs/help/basic/using-the-banner.md | 12 ++++++++++++ 2 files changed, 12 insertions(+) create mode 100644 android/docs/help/android_images/disable-suggestions.png diff --git a/android/docs/help/android_images/disable-suggestions.png b/android/docs/help/android_images/disable-suggestions.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a21b98cb5d277509ebbb21bf92141ead7d7048 GIT binary patch literal 15434 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�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 (select an installed language) + +At the bottom of the language settings menu are three controls for the banner: + +![](../android_images/disable-suggestions.png) + +* Disable suggestions (Display image banner instead) +* Predictions only (Suggestion banner displays predictions) +* Predictions with corrections (Suggestion banner displays predictions and corrections) + ## Using the Suggestion Banner If a [dictionary is installed](installing-dictionaries) and enabled for the active Keyman keyboard, the banner will display suggestions that can be selected. From bcca646dedcb76e830a07924707c0129a1346928 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Mon, 20 Jan 2025 15:04:53 +0700 Subject: [PATCH 6/7] Revert "Merge pull request #12940 from keymanapp/fix/web/unit-test-affected-by-autocorrect" This reverts commit 217592ff9f844cabfa158fa1003446668888255e, reversing changes made to fc15e616a729ba9bfa2ef096fc149098474a30f6. --- .../interfaces/prediction/predictionContext.tests.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js index 9aa9cd8015..4217aeb69b 100644 --- a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js +++ b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js @@ -161,21 +161,15 @@ describe("PredictionContext", () => { assert.equal(updateFake.callCount, 3); suggestions = updateFake.thirdCall.args[0]; - // Note: this unit test was originally written with auto-correct on! - // #11941 was written 2024-07-25 (added unit test for auto-correction method) - // #12169 was written 2024-08-14, which is what added THIS unit test. - // This does re-use the apply-revert oriented mocking. // Should skip the (second) "apple", "apply", "apps" round, as it became outdated // by its following request before its response could be received. - assert.deepEqual(suggestions.map((obj) => obj.displayAs), ['applied']); // '“apple”' included with auto-correct enabled. - // Is not displayed; we only display it if auto-correct is on, as 'applied' would be automatic then. - assert.equal(predictiveContext.keepSuggestion.displayAs, '“apple”'); - // assert.equal(suggestions.find((obj) => obj.tag == 'keep').displayAs, '“apple”'); // with auto-correct enabled. + assert.deepEqual(suggestions.map((obj) => obj.displayAs), ['“apple”', 'applied']); + assert.equal(suggestions.find((obj) => obj.tag == 'keep').displayAs, '“apple”'); assert.equal(suggestions.find((obj) => obj.transform.deleteLeft != 0).displayAs, 'applied'); // Our reused mocking doesn't directly provide the 'keep' suggestion; we // need to remove it before testing for set equality. - assert.deepEqual(suggestions /*.splice(1)*/, expected); + assert.deepEqual(suggestions.splice(1), expected); }); it('sendUpdateState retrieves the most recent suggestion set', async function() { From 7c1d15ff963f825b7ca9c400fddb5524a5a6515a Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Mon, 20 Jan 2025 16:00:48 +0700 Subject: [PATCH 7/7] chore(web): deletes unit-test line with now-invalid assumption --- .../engine/interfaces/prediction/predictionContext.tests.js | 1 - 1 file changed, 1 deletion(-) diff --git a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js index 4217aeb69b..ddcdc4853e 100644 --- a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js +++ b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.js @@ -166,7 +166,6 @@ describe("PredictionContext", () => { // by its following request before its response could be received. assert.deepEqual(suggestions.map((obj) => obj.displayAs), ['“apple”', 'applied']); assert.equal(suggestions.find((obj) => obj.tag == 'keep').displayAs, '“apple”'); - assert.equal(suggestions.find((obj) => obj.transform.deleteLeft != 0).displayAs, 'applied'); // Our reused mocking doesn't directly provide the 'keep' suggestion; we // need to remove it before testing for set equality. assert.deepEqual(suggestions.splice(1), expected);