Skip to content

Commit 9d7332c

Browse files
taku910hiroyuki-komatsu
authored andcommitted
Simplified the logic of candidate filtering rule for Desktop.
1. When the top candidate is filtered, all other candidates were filtered. Disabled this filtering rule for the sake of simplicity. 2. Disabled the length and frequency based filtering. PiperOrigin-RevId: 811682326
1 parent 01b1503 commit 9d7332c

File tree

3 files changed

+30
-88
lines changed

3 files changed

+30
-88
lines changed

src/prediction/user_history_predictor.cc

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,8 +1459,8 @@ void UserHistoryPredictor::GetInputKeyFromRequest(
14591459
}
14601460

14611461
UserHistoryPredictor::ResultType UserHistoryPredictor::GetResultType(
1462-
const ConversionRequest& request, bool is_top_candidate,
1463-
uint32_t request_key_len, const Entry& entry) {
1462+
const ConversionRequest& request, uint32_t request_key_len,
1463+
const Entry& entry) {
14641464
if (IsMixedConversionEnabled(request)) {
14651465
// Don't show long history for mixed conversion
14661466
if (entry.suggestion_freq() <= 1 && Util::CharsLen(entry.value()) >= 9) {
@@ -1470,35 +1470,7 @@ UserHistoryPredictor::ResultType UserHistoryPredictor::GetResultType(
14701470
return ResultType::GOOD_RESULT;
14711471
}
14721472

1473-
if (request.request_type() == ConversionRequest::SUGGESTION) {
1474-
// When bigram_boost is true, that means that previous user input
1475-
// and current input have bigram relation.
1476-
if (entry.bigram_boost()) {
1477-
return ResultType::GOOD_RESULT;
1478-
}
1479-
1480-
// Accepts short key prefix only when the frequency is >= 2.
1481-
const uint32_t min_prefix_len = entry.suggestion_freq() >= 2 ? 1 : 2;
1482-
if (request_key_len >= min_prefix_len) {
1483-
return ResultType::GOOD_RESULT;
1484-
}
1485-
1486-
// The top result of suggestion should be a VALID suggestion candidate.
1487-
// i.e., SuggestionTriggerFunc should return true for the first
1488-
// candidate.
1489-
// If user types "デスノート" too many times, "デスノート" will be
1490-
// suggested when user types "で". It is expected, but if user types
1491-
// "です" after that, showing "デスノート" is annoying.
1492-
// In this situation, "です" is in the LRU, but SuggestionTriggerFunc
1493-
// returns false for "です", since it is short.
1494-
if (is_top_candidate) {
1495-
MOZC_VLOG(2) << "candidates size is 0";
1496-
return ResultType::STOP_ENUMERATION;
1497-
}
1498-
1499-
return ResultType::BAD_RESULT;
1500-
}
1501-
1473+
// No suppression rule on desktop for the sake of simplicity.
15021474
return ResultType::GOOD_RESULT;
15031475
}
15041476

@@ -1514,7 +1486,6 @@ std::vector<Result> UserHistoryPredictor::MakeResults(
15141486
}
15151487
const uint32_t request_key_len = Util::CharsLen(request.key());
15161488

1517-
size_t inserted_num = 0;
15181489
size_t inserted_char_coverage = 0;
15191490

15201491
std::vector<const UserHistoryPredictor::Entry*> entries;
@@ -1557,7 +1528,7 @@ std::vector<Result> UserHistoryPredictor::MakeResults(
15571528
return true;
15581529
};
15591530

1560-
while (inserted_num < max_prediction_size) {
1531+
while (entries.size() < max_prediction_size) {
15611532
// |entry_queue| is a priority queue where the element
15621533
// in the queue is sorted by the score defined in GetScore().
15631534
const Entry* result_entry = entry_queue->Pop();
@@ -1566,11 +1537,8 @@ std::vector<Result> UserHistoryPredictor::MakeResults(
15661537
break;
15671538
}
15681539

1569-
const ResultType result =
1570-
GetResultType(request, entries.empty(), request_key_len, *result_entry);
1571-
if (result == ResultType::STOP_ENUMERATION) {
1572-
break;
1573-
} else if (result == ResultType::BAD_RESULT) {
1540+
if (GetResultType(request, request_key_len, *result_entry) ==
1541+
ResultType::BAD_RESULT) {
15741542
continue;
15751543
}
15761544

@@ -1583,14 +1551,12 @@ std::vector<Result> UserHistoryPredictor::MakeResults(
15831551
// Break when the accumulated character length exceeds the
15841552
// `max_prediction_char_coverage`. Allows to add at least one candidate.
15851553
const size_t value_len = Util::CharsLen(result_entry->value());
1586-
if (max_prediction_char_coverage > 0 && inserted_num > 0 &&
1554+
if (max_prediction_char_coverage > 0 && !entries.empty() &&
15871555
inserted_char_coverage + value_len > max_prediction_char_coverage) {
15881556
break;
15891557
}
15901558

15911559
entries.emplace_back(result_entry);
1592-
1593-
++inserted_num;
15941560
inserted_char_coverage += value_len;
15951561
}
15961562

src/prediction/user_history_predictor.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,6 @@ class UserHistoryPredictor : public PredictorInterface {
204204
enum class ResultType {
205205
GOOD_RESULT,
206206
BAD_RESULT,
207-
STOP_ENUMERATION, // Do not insert and stop enumerations
208207
};
209208

210209
// Returns true if this predictor should return results for the input.
@@ -243,7 +242,6 @@ class UserHistoryPredictor : public PredictorInterface {
243242
static bool HasBigramEntry(const Entry& entry, const Entry& prev_entry);
244243

245244
static ResultType GetResultType(const ConversionRequest& request,
246-
bool is_top_candidate,
247245
uint32_t request_key_len, const Entry& entry);
248246

249247
// Returns true if entry is DEFAULT_ENTRY, satisfies certain conditions, and

src/prediction/user_history_predictor_test.cc

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,14 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorClearTest) {
13341334
predictor->ClearAllHistory();
13351335
WaitForSyncer(predictor);
13361336

1337+
{
1338+
SegmentsProxy segments_proxy;
1339+
const ConversionRequest convreq1 =
1340+
SetUpInputForSuggestion("t", &composer_, &segments_proxy);
1341+
results = predictor->Predict(convreq1);
1342+
EXPECT_TRUE(results.empty());
1343+
}
1344+
13371345
// input "testtest" 1 time
13381346
for (int i = 0; i < 1; ++i) {
13391347
SegmentsProxy segments_proxy;
@@ -1349,12 +1357,6 @@ TEST_F(UserHistoryPredictorTest, UserHistoryPredictorClearTest) {
13491357
const ConversionRequest convreq1 =
13501358
SetUpInputForSuggestion("t", &composer_, &segments_proxy);
13511359
results = predictor->Predict(convreq1);
1352-
EXPECT_TRUE(results.empty());
1353-
1354-
segments_proxy.Clear();
1355-
const ConversionRequest convreq2 =
1356-
SetUpInputForSuggestion("testte", &composer_, &segments_proxy);
1357-
results = predictor->Predict(convreq2);
13581360
EXPECT_FALSE(results.empty());
13591361
}
13601362
}
@@ -1752,7 +1754,7 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsMultiInput) {
17521754
const ConversionRequest convreq2 =
17531755
SetUpInputForSuggestion("", &composer_, &segments_proxy);
17541756
results = predictor->Predict(convreq2);
1755-
EXPECT_TRUE(results.empty());
1757+
EXPECT_FALSE(results.empty()); // "たろう"
17561758

17571759
segments_proxy.Clear();
17581760
const ConversionRequest convreq3 =
@@ -1867,7 +1869,7 @@ TEST_F(UserHistoryPredictorTest, MultiSegmentsSingleInput) {
18671869
const ConversionRequest convreq3 =
18681870
SetUpInputForSuggestion("", &composer_, &segments_proxy);
18691871
results = predictor->Predict(convreq3);
1870-
EXPECT_TRUE(results.empty());
1872+
EXPECT_FALSE(results.empty()); // たろうは
18711873

18721874
segments_proxy.Clear();
18731875
const ConversionRequest convreq4 =
@@ -2444,38 +2446,17 @@ TEST_F(UserHistoryPredictorTest, GetResultType) {
24442446
.SetRequestType(ConversionRequest::SUGGESTION)
24452447
.Build();
24462448

2449+
// Always return GOOD_RESULT
24472450
entry.set_bigram_boost(true);
2448-
EXPECT_EQ(
2449-
UserHistoryPredictorTestPeer::GetResultType(convreq, false, 1, entry),
2450-
ResultType::GOOD_RESULT);
2451+
EXPECT_EQ(UserHistoryPredictorTestPeer::GetResultType(convreq, 1, entry),
2452+
ResultType::GOOD_RESULT);
24512453

24522454
entry.set_bigram_boost(false);
2453-
2454-
// const uint32_t freq = entry.suggestion_freq();
2455-
// const uint32_t base_prefix_len = 3 - std::min<uint32_t>(2, freq);
2456-
// if (request_key_len >= base_prefix_len) {
2457-
// 3 >= 3 - min(2, 1) -> OK
2458-
entry.set_suggestion_freq(1);
2459-
EXPECT_EQ(
2460-
UserHistoryPredictorTestPeer::GetResultType(convreq, false, 3, entry),
2461-
ResultType::GOOD_RESULT);
2462-
2463-
// 1 >= 3 - min(2, 1) -> NG
2464-
entry.set_suggestion_freq(1);
2465-
EXPECT_EQ(
2466-
UserHistoryPredictorTestPeer::GetResultType(convreq, false, 1, entry),
2467-
ResultType::BAD_RESULT);
2468-
2469-
// 1 >= 3 - min(2, 2) -> OK
24702455
entry.set_suggestion_freq(1);
2471-
EXPECT_EQ(
2472-
UserHistoryPredictorTestPeer::GetResultType(convreq, false, 1, entry),
2473-
ResultType::BAD_RESULT);
2474-
2475-
entry.set_suggestion_freq(1);
2476-
EXPECT_EQ(
2477-
UserHistoryPredictorTestPeer::GetResultType(convreq, true, 1, entry),
2478-
ResultType::STOP_ENUMERATION);
2456+
EXPECT_EQ(UserHistoryPredictorTestPeer::GetResultType(convreq, 3, entry),
2457+
ResultType::GOOD_RESULT);
2458+
EXPECT_EQ(UserHistoryPredictorTestPeer::GetResultType(convreq, 1, entry),
2459+
ResultType::GOOD_RESULT);
24792460
}
24802461

24812462
// mobile
@@ -2488,21 +2469,18 @@ TEST_F(UserHistoryPredictorTest, GetResultType) {
24882469
// entry.suggestion_freq() < 2 && Util::CharsLen(entry.value()) > 8
24892470
entry.set_suggestion_freq(1);
24902471
entry.set_value("よろしく");
2491-
EXPECT_EQ(
2492-
UserHistoryPredictorTestPeer::GetResultType(convreq, false, 1, entry),
2493-
ResultType::GOOD_RESULT);
2472+
EXPECT_EQ(UserHistoryPredictorTestPeer::GetResultType(convreq, 1, entry),
2473+
ResultType::GOOD_RESULT);
24942474

24952475
entry.set_suggestion_freq(2); // high freq
24962476
entry.set_value("よろしくおねがいします。"); // too long
2497-
EXPECT_EQ(
2498-
UserHistoryPredictorTestPeer::GetResultType(convreq, false, 1, entry),
2499-
ResultType::GOOD_RESULT);
2477+
EXPECT_EQ(UserHistoryPredictorTestPeer::GetResultType(convreq, 1, entry),
2478+
ResultType::GOOD_RESULT);
25002479

25012480
entry.set_suggestion_freq(1); // low freq
25022481
entry.set_value("よろしくおねがいします。"); // too long
2503-
EXPECT_EQ(
2504-
UserHistoryPredictorTestPeer::GetResultType(convreq, false, 1, entry),
2505-
ResultType::BAD_RESULT);
2482+
EXPECT_EQ(UserHistoryPredictorTestPeer::GetResultType(convreq, 1, entry),
2483+
ResultType::BAD_RESULT);
25062484
}
25072485
}
25082486

0 commit comments

Comments
 (0)