Skip to content

Commit 64418f8

Browse files
committed
Fix #11: Merge branch 'feat-11-get-suggestions' into master
2 parents be1d204 + 14f9611 commit 64418f8

File tree

7 files changed

+157
-5
lines changed

7 files changed

+157
-5
lines changed

c-shared.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,22 @@ func varnam_transliterate_advanced(varnamHandleID C.int, id C.int, word *C.char,
205205
}
206206
}
207207

208+
//export varnam_transliterate_greedy_tokenized
209+
func varnam_transliterate_greedy_tokenized(varnamHandleID C.int, word *C.char, resultPointer **C.varray) C.int {
210+
handle := getVarnamHandle(varnamHandleID)
211+
212+
result := handle.varnam.TransliterateGreedyTokenized(C.GoString(word))
213+
214+
ptr := C.varray_init()
215+
for _, sug := range result {
216+
cSug := unsafe.Pointer(C.makeSuggestion(C.CString(sug.Word), C.int(sug.Weight), C.int(sug.LearnedOn)))
217+
C.varray_push(ptr, cSug)
218+
}
219+
*resultPointer = ptr
220+
221+
return C.VARNAM_SUCCESS
222+
}
223+
208224
//export varnam_reverse_transliterate
209225
func varnam_reverse_transliterate(varnamHandleID C.int, word *C.char, resultPointer **C.varray) C.int {
210226
handle := getVarnamHandle(varnamHandleID)
@@ -442,6 +458,25 @@ func varnam_get_recently_learned_words(varnamHandleID C.int, id C.int, offset C.
442458
return C.VARNAM_SUCCESS
443459
}
444460

461+
//export varnam_get_suggestions
462+
func varnam_get_suggestions(varnamHandleID C.int, id C.int, word *C.char, resultPointer **C.varray) C.int {
463+
ctx, cancel := makeContext(id)
464+
defer cancel()
465+
466+
handle := getVarnamHandle(varnamHandleID)
467+
468+
result := handle.varnam.GetSuggestions(ctx, C.GoString(word))
469+
470+
ptr := C.varray_init()
471+
for _, sug := range result {
472+
cSug := unsafe.Pointer(C.makeSuggestion(C.CString(sug.Word), C.int(sug.Weight), C.int(sug.LearnedOn)))
473+
C.varray_push(ptr, cSug)
474+
}
475+
*resultPointer = ptr
476+
477+
return C.VARNAM_SUCCESS
478+
}
479+
445480
func makeCSchemeDetails(sd govarnam.SchemeDetails) *C.struct_SchemeDetails_t {
446481
var cIsStable C.int
447482

govarnam/dictionary.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,3 +398,15 @@ func (varnam *Varnam) GetRecentlyLearntWords(ctx context.Context, offset int, li
398398
return result, nil
399399
}
400400
}
401+
402+
// GetSuggestions get word suggestions from dictionary
403+
func (varnam *Varnam) GetSuggestions(ctx context.Context, word string) []Suggestion {
404+
var sugs []Suggestion
405+
406+
select {
407+
case <-ctx.Done():
408+
return sugs
409+
default:
410+
return varnam.searchDictionary(ctx, []string{word}, true)
411+
}
412+
}

govarnam/govarnam.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,12 +385,12 @@ func (varnam *Varnam) TransliterateWithContext(ctx context.Context, word string,
385385
}
386386
}
387387

388-
// TransliterateGreedy transliterate word without all possible suggestions in result
389-
func (varnam *Varnam) TransliterateGreedy(word string) TransliterationResult {
388+
// TransliterateGreedyTokenized transliterate word, only tokenizer results
389+
func (varnam *Varnam) TransliterateGreedyTokenized(word string) []Suggestion {
390390
ctx := context.Background()
391-
_, result := varnam.transliterate(ctx, word)
392391

393-
return result
392+
tokens := varnam.tokenizeWord(ctx, word, VARNAM_MATCH_EXACT, false)
393+
return varnam.tokensToSuggestions(ctx, tokens, false, varnam.TokenizerSuggestionsLimit)
394394
}
395395

396396
// ReverseTransliterate do a reverse transliteration

govarnam/govarnam_ml_test.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ func TestMLDictionaryMatchExact(t *testing.T) {
398398
varnam.DictionaryMatchExact = false
399399
}
400400

401-
func TestRecentlyLearnedWords(t *testing.T) {
401+
func TestMLRecentlyLearnedWords(t *testing.T) {
402402
varnam := getVarnamInstance("ml")
403403

404404
words := []string{"ആലപ്പുഴ", "എറണാകുളം", "തൃശ്ശൂർ", "പാലക്കാട്", "കോഴിക്കോട്"}
@@ -418,3 +418,18 @@ func TestRecentlyLearnedWords(t *testing.T) {
418418
result, err = varnam.GetRecentlyLearntWords(context.Background(), 4, len(words))
419419
assertEqual(t, result[0].Word, "ആലപ്പുഴ")
420420
}
421+
422+
func TestMLGetSuggestions(t *testing.T) {
423+
varnam := getVarnamInstance("ml")
424+
425+
words := []string{"ആലപ്പുഴ", "ആലം", "ആലാപനം"}
426+
for _, word := range words {
427+
varnam.Learn(word, 0)
428+
}
429+
430+
varnam.DictionarySuggestionsLimit = 5
431+
result := varnam.GetSuggestions(context.Background(), "ആല")
432+
assertEqual(t, len(result), 3)
433+
434+
assertEqual(t, result[0].Word, "ആലപ്പുഴ")
435+
}

govarnamgo/govarnamgo.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import "C"
1616
import (
1717
"context"
1818
"fmt"
19+
"log"
1920
"unsafe"
2021
)
2122

@@ -370,6 +371,32 @@ func (handle *VarnamHandle) TransliterateAdvanced(ctx context.Context, word stri
370371
}
371372
}
372373

374+
// TransliterateGreedyTokenized transliterate but only tokenizer output
375+
func (handle *VarnamHandle) TransliterateGreedyTokenized(word string) []Suggestion {
376+
var result []Suggestion
377+
378+
var resultPointer *C.varray
379+
380+
cWord := C.CString(word)
381+
defer C.free(unsafe.Pointer(cWord))
382+
383+
code := C.varnam_transliterate_greedy_tokenized(handle.connectionID, cWord, &resultPointer)
384+
if code != C.VARNAM_SUCCESS {
385+
log.Print(handle.GetLastError())
386+
return result
387+
}
388+
389+
i := 0
390+
for i < int(C.varray_length(resultPointer)) {
391+
cSug := (*C.Suggestion)(C.varray_get(resultPointer, C.int(i)))
392+
sug := makeSuggestion(cSug)
393+
result = append(result, sug)
394+
i++
395+
}
396+
397+
return result
398+
}
399+
373400
// ReverseTransliterate reverse transilterate
374401
func (handle *VarnamHandle) ReverseTransliterate(word string) ([]Suggestion, error) {
375402
var sugs []Suggestion
@@ -513,6 +540,42 @@ func (handle *VarnamHandle) GetRecentlyLearntWords(ctx context.Context, offset i
513540
}
514541
}
515542

543+
// GetSuggestions get suggestions for a word
544+
func (handle *VarnamHandle) GetSuggestions(ctx context.Context, word string) ([]Suggestion, error) {
545+
var result []Suggestion
546+
547+
operationID := makeContextOperation()
548+
549+
select {
550+
case <-ctx.Done():
551+
C.varnam_cancel(operationID)
552+
return result, nil
553+
default:
554+
var resultPointer *C.varray
555+
556+
cWord := C.CString(word)
557+
defer C.free(unsafe.Pointer(cWord))
558+
559+
code := C.varnam_get_suggestions(handle.connectionID, operationID, cWord, &resultPointer)
560+
if code != C.VARNAM_SUCCESS {
561+
return result, &VarnamError{
562+
ErrorCode: int(code),
563+
Message: handle.GetLastError(),
564+
}
565+
}
566+
567+
i := 0
568+
for i < int(C.varray_length(resultPointer)) {
569+
cSug := (*C.Suggestion)(C.varray_get(resultPointer, C.int(i)))
570+
sug := makeSuggestion(cSug)
571+
result = append(result, sug)
572+
i++
573+
}
574+
575+
return result, nil
576+
}
577+
}
578+
516579
func makeGoSchemeDetails(cSD *C.struct_SchemeDetails_t) SchemeDetails {
517580
isStable := true
518581
if cSD.IsStable == 0 {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package govarnamgo
2+
3+
import (
4+
"context"
5+
"testing"
6+
)
7+
8+
func TestMLInscriptTransilterateGreedyTokenized(t *testing.T) {
9+
varnam := getVarnamInstance("ml-inscript")
10+
11+
assertEqual(t, varnam.TransliterateGreedyTokenized("EnhdhgB")[0].Word, "ആലപ്പുഴ")
12+
}
13+
14+
func TestMLInscriptGetSuggestions(t *testing.T) {
15+
varnam := getVarnamInstance("ml-inscript")
16+
17+
varnam.Learn("ഇടുക്കി", 0)
18+
19+
sugs, err := varnam.GetSuggestions(
20+
context.Background(),
21+
varnam.TransliterateGreedyTokenized("F'")[0].Word, // ഇട
22+
)
23+
checkError(err)
24+
25+
assertEqual(t, sugs[0].Word, "ഇടുക്കി")
26+
}

govarnamgo/govarnamgo_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ func tearDown() {
6060

6161
func TestMain(m *testing.M) {
6262
setUp("ml")
63+
setUp("ml-inscript")
6364
m.Run()
6465
tearDown()
6566
}

0 commit comments

Comments
 (0)