Skip to content

Commit 6ae34de

Browse files
committed
feat(translator): look at preceding text when making sentence
1 parent 57c70a7 commit 6ae34de

9 files changed

+44
-10
lines changed

src/rime/commit_history.h

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class CommitHistory : public list<CommitRecord> {
2929
void Push(const KeyEvent& key_event);
3030
void Push(const Composition& composition, const string& input);
3131
string repr() const;
32+
string latest_text() const {
33+
return empty() ? string() : back().text;
34+
}
3235
};
3336

3437
} // Namespace rime

src/rime/gear/poet.cc

+4-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ bool Poet::LeftAssociateCompare(const Sentence& one, const Sentence& other) {
4242
}
4343

4444
an<Sentence> Poet::MakeSentence(const WordGraph& graph,
45-
size_t total_length) {
45+
size_t total_length,
46+
const string& preceding_text) {
4647
// TODO: save more intermediate sentence candidates
4748
map<int, an<Sentence>> sentences;
4849
sentences[0] = New<Sentence>(language_);
@@ -61,7 +62,8 @@ an<Sentence> Poet::MakeSentence(const WordGraph& graph,
6162
const DictEntryList& entries(x.second);
6263
for (const auto& entry : entries) {
6364
auto new_sentence = New<Sentence>(*sentences[start_pos]);
64-
new_sentence->Extend(*entry, end_pos, is_rear, grammar_.get());
65+
new_sentence->Extend(
66+
*entry, end_pos, is_rear, preceding_text, grammar_.get());
6567
if (sentences.find(end_pos) == sentences.end() ||
6668
compare_(*sentences[end_pos], *new_sentence)) {
6769
DLOG(INFO) << "updated sentences " << end_pos << ") with "

src/rime/gear/poet.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ class Poet {
3535
Compare compare = CompareWeight);
3636
~Poet();
3737

38-
an<Sentence> MakeSentence(const WordGraph& graph, size_t total_length);
38+
an<Sentence> MakeSentence(const WordGraph& graph,
39+
size_t total_length,
40+
const string& preceding_text);
3941

4042
private:
4143
const Language* language_;

src/rime/gear/script_translator.cc

+10-3
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,11 @@ string ScriptTranslator::Spell(const Code& code) {
214214
return result;
215215
}
216216

217+
string ScriptTranslator::GetPrecedingText() const {
218+
return contextual_suggestions_ ?
219+
engine_->context()->commit_history().latest_text() : string();
220+
}
221+
217222
bool ScriptTranslator::Memorize(const CommitEntry& commit_entry) {
218223
bool update_elements = false;
219224
// avoid updating single character entries within a phrase which is
@@ -538,12 +543,14 @@ an<Sentence> ScriptTranslation::MakeSentence(Dictionary* dict,
538543
}
539544
}
540545
}
541-
auto sentence = poet_->MakeSentence(graph, syllable_graph.interpreted_length);
542-
if (sentence) {
546+
if (auto sentence = poet_->MakeSentence(graph,
547+
syllable_graph.interpreted_length,
548+
translator_->GetPrecedingText())) {
543549
sentence->Offset(start_);
544550
sentence->set_syllabifier(syllabifier_);
551+
return sentence;
545552
}
546-
return sentence;
553+
return nullptr;
547554
}
548555

549556
} // namespace rime

src/rime/gear/script_translator.h

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class ScriptTranslator : public Translator,
3737

3838
string FormatPreedit(const string& preedit);
3939
string Spell(const Code& code);
40+
string GetPrecedingText() const;
4041

4142
// options
4243
int max_homophones() const { return max_homophones_; }

src/rime/gear/table_translator.cc

+11-2
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,9 @@ bool TableTranslator::Memorize(const CommitEntry& commit_entry) {
342342
}
343343
string phrase;
344344
for (; it != history.rend(); ++it) {
345-
if (it->type != "table" && it->type != "sentence" && it->type != "uniquified")
345+
if (it->type != "table" &&
346+
it->type != "sentence" &&
347+
it->type != "uniquified")
346348
break;
347349
if (phrase.empty()) {
348350
phrase = it->text; // last word
@@ -362,6 +364,11 @@ bool TableTranslator::Memorize(const CommitEntry& commit_entry) {
362364
return true;
363365
}
364366

367+
string TableTranslator::GetPrecedingText() const {
368+
return contextual_suggestions_ ?
369+
engine_->context()->commit_history().latest_text() : string();
370+
}
371+
365372
// SentenceSyllabifier
366373

367374
class SentenceSyllabifier : public PhraseSyllabifier {
@@ -680,7 +687,9 @@ TableTranslator::MakeSentence(const string& input, size_t start,
680687
}
681688
}
682689
}
683-
if (auto sentence = poet_->MakeSentence(graph, input.length())) {
690+
if (auto sentence = poet_->MakeSentence(graph,
691+
input.length(),
692+
GetPrecedingText())) {
684693
auto result = Cached<SentenceTranslation>(
685694
this,
686695
std::move(sentence),

src/rime/gear/table_translator.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class TableTranslator : public Translator,
3535
an<Translation> MakeSentence(const string& input,
3636
size_t start,
3737
bool include_prefix_phrases = false);
38-
38+
string GetPrecedingText() const;
3939
UnityTableEncoder* encoder() const { return encoder_.get(); }
4040

4141
protected:

src/rime/gear/translator_commons.cc

+5-1
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ bool Spans::HasVertex(size_t vertex) const {
9191
void Sentence::Extend(const DictEntry& entry,
9292
size_t end_pos,
9393
bool is_rear,
94+
const string& preceding_text,
9495
Grammar* grammar) {
95-
entry_->weight += Grammar::Evaluate(text(), entry, is_rear, grammar);
96+
const string& context = empty() ? preceding_text : text();
97+
entry_->weight += Grammar::Evaluate(context, entry, is_rear, grammar);
9698
entry_->text.append(entry.text);
9799
entry_->code.insert(entry_->code.end(),
98100
entry.code.begin(),
@@ -118,6 +120,8 @@ TranslatorOptions::TranslatorOptions(const Ticket& ticket) {
118120
config->GetString(ticket.name_space + "/delimiter", &delimiters_) ||
119121
config->GetString("speller/delimiter", &delimiters_);
120122
config->GetString(ticket.name_space + "/tag", &tag_);
123+
config->GetBool(ticket.name_space + "/contextual_suggestions",
124+
&contextual_suggestions_);
121125
config->GetBool(ticket.name_space + "/enable_completion",
122126
&enable_completion_);
123127
config->GetBool(ticket.name_space + "/strict_spelling",

src/rime/gear/translator_commons.h

+6
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ class Sentence : public Phrase {
124124
void Extend(const DictEntry& entry,
125125
size_t end_pos,
126126
bool is_rear,
127+
const string& preceding_text,
127128
Grammar* grammar);
128129
void Offset(size_t offset);
129130

@@ -159,6 +160,10 @@ class TranslatorOptions {
159160
const string& delimiters() const { return delimiters_; }
160161
const string& tag() const { return tag_; }
161162
void set_tag(const string& tag) { tag_ = tag; }
163+
bool contextual_suggestions() const { return contextual_suggestions_; }
164+
void set_contextual_suggestions(bool enabled) {
165+
contextual_suggestions_ = enabled;
166+
}
162167
bool enable_completion() const { return enable_completion_; }
163168
void set_enable_completion(bool enabled) { enable_completion_ = enabled; }
164169
bool strict_spelling() const { return strict_spelling_; }
@@ -171,6 +176,7 @@ class TranslatorOptions {
171176
protected:
172177
string delimiters_;
173178
string tag_ = "abc";
179+
bool contextual_suggestions_ = false;
174180
bool enable_completion_ = true;
175181
bool strict_spelling_ = false;
176182
double initial_quality_ = 0.;

0 commit comments

Comments
 (0)