Proposal: context-aware learning from accepted and reverted suggestions
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 28/100
Hướng nghiên cứu
Start by reading DictionaryFacilitatorImpl, Suggest, and the existing UserHistoryDictionary mechanisms to understand candidate generation, final ranking, and available storage; the issue does not name specific test files. The proposed first step is rejection feedback: detect an immediate revert, store a bounded negative association, and apply a capped penalty to an existing candidate, with regression tests and no learning in sensitive fields or incognito mode.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Problem
LeanType already has several personalization mechanisms:
UserHistoryDictionary- personal dictionary suggestions
- session word boost
- bigram/trigram history
- configurable personal-suggestion boost
However, these mechanisms mainly learn that a word was used. They do not reliably learn that a particular candidate was the correct choice for a specific mistyped input and context.
For users who mostly enter text by selecting suggestions, this can produce a recurring pattern:
- The intended word is present in the suggestion strip, but ranked second or third.
- The user repeatedly selects it manually.
- The same less suitable candidate remains ranked first on future occurrences.
- A suggestion reverted immediately with Backspace may still remain highly ranked.
This appears related to the personalization balance discussed in #382, but the proposed change would not increase the global weight of personal words.
Proposed direction
Keep the existing dictionary candidate generation unchanged and add a small, bounded feedback layer for suggestion ranking.
Possible feedback signals:
- Selecting suggestion #2 or #3: weak positive feedback for that candidate for the same typed form.
- Repeatedly selecting the same candidate: gradually increase its contextual preference.
- Reverting an autocorrection immediately with Backspace: strong negative feedback for that correction.
- Replacing a selected suggestion immediately: negative feedback for the removed candidate and positive feedback for the replacement.
- Matching previous-word context: allow a larger adjustment than a typed-form-only match.
The feedback should only reorder candidates already produced by the existing dictionaries. It should not generate new words or replace the current decoder.
A simplified model could be:
finalScore = originalScore + contextualFeedbackBoost - rejectionPenalty
The adjustment should be capped so that learned feedback cannot override a clearly better dictionary/spatial match.
Shadow-mode evaluation
Before changing visible suggestions, the candidate ranker could first run in an optional local shadow mode:
baseline order: A, B, C
candidate order: B, A, C
user selected: B
outcome: helped
This would make the feature measurable rather than opaque:
helped: the candidate ranker would move the selected word higher;hurt: the baseline ranked the selected word higher;neutral: no meaningful rank change.
Useful local metrics would include Top-1/Top-3 accuracy, mean reciprocal rank, immediate revert rate, helped vs hurt, and suggestion latency. Visible reranking could remain disabled until enough local evidence shows a meaningful positive margin.
Integration constraints
I would like to keep this compatible with the existing architecture:
- candidate generation remains in
DictionaryFacilitatorImpl; - final suggestion construction remains in
Suggest; - reuse existing user-history mechanisms where practical;
- no network access or telemetry;
- no learning in password fields or incognito mode;
- bounded local storage with decay or eviction;
- no complete-message storage;
- no noticeable latency in the suggestion hot path;
- optional/experimental behavior if it may not be wanted by everyone.
Non-goals
This proposal does not include:
- replacing the AOSP/native dictionary decoder;
- adding an LLM or large neural model;
- introducing a new unified dictionary format;
- changing gesture typing;
- globally increasing the priority of all personal words.
Suggested implementation sequence
PR 1: rejection feedback
Teach LeanType not to repeatedly prefer a suggestion that the user immediately reverted.
This would be intentionally small and independently useful:
- detect immediate revert of an autocorrection or selected suggestion;
- record a bounded negative association;
- apply a capped penalty when the same correction is proposed again;
- add focused regression tests;
- do not learn in sensitive fields or incognito mode.
Candidate generation would remain unchanged; this PR would only apply a bounded penalty to an already generated candidate.
PR 2: accepted-suggestion feedback
After the first behavior is validated:
- learn when the user repeatedly selects a lower-ranked candidate;
- include previous-word context;
- cap and decay old feedback;
- add ranking tests with synthetic candidates and contexts.
Touch-position adaptation could be considered separately only if evidence shows that the intended word is frequently absent from the candidate list rather than merely ranked poorly.
Questions before implementation
- Would a small feedback layer on top of the existing suggestion scores fit the direction of LeanType?
- Should rejection feedback be stored through
UserHistoryDictionary, or would a separate bounded local store be preferable? - Is immediate Backspace after autocorrection a sufficiently reliable rejection signal for the first PR?
- Would you prefer this behind the existing personalized-suggestions setting or a separate experimental toggle?
I can prepare the first narrowly scoped PR after agreeing on the storage and integration point.
- Ngôn ngữ chính
- Kotlin
- Star
- 1k
- Fork
- 59
- Merge trung bình
- 13 giờ 11 phút
- Pull request đã merge (30 ngày)
- 47
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của LeanBitLab/LeanType
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
LeanBitLab/LeanType#713 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
LeanBitLab/LeanType#423 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Crush ReportĐang mở
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 20/100
LeanBitLab/LeanType#715 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Text Expander/cursor-handling bugCó thể đã có người làm @LeanBitLab đã nhận 2 ngày trước. Đang mởbug
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 62/100
LeanBitLab/LeanType#703 · 1 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 45/100
LeanBitLab/LeanType#699 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của LeanBitLab/LeanType
Issue tương tự
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
lugassawan/swe-workbench#823 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 80/100
Droid-Deck/DroidDeck#1355 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
IronCoreLabs/ironcore-alloy#351 ·
-
Lovelace refine Taak
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
MinBZK/MijnOverheidZakelijk#1383 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
world-federation-of-advertisers/cross-media-measurement#4739 ·
Maintainer thường phản hồi trong vòng 1 ngày