一段時間以來,我一直在通過以下方式對文本進行規范化和去重音:// Local helper function for normalization of UTF8 strings.func isMn (r rune) bool { return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks }// This map is used by RemoveAccents function to convert non-accented characters.var transliterations = map[rune]string{'?':"E",'D':"D",'?':"L",'?':"OE",'T':"Th",'?':"ss",'?':"e",'e':"d",'?':"l",'?':"oe",'t':"th",'?':"OE",'?':"oe"}// removeAccentsBytes converts accented UTF8 characters into their non-accented equivalents, from a []byte.func removeAccentsBytesDashes(b []byte) ([]byte, error) { mnBuf := make([]byte, len(b)) t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) n, _, err := t.Transform(mnBuf, b, true) if err != nil { return nil, err } mnBuf = mnBuf[:n] tlBuf := bytes.NewBuffer(make([]byte, 0, len(mnBuf)*2)) for i, w := 0, 0; i < len(mnBuf); i += w { r, width := utf8.DecodeRune(mnBuf[i:]) if r=='-' { tlBuf.WriteByte(' ') } else { if d, ok := transliterations[r]; ok { tlBuf.WriteString(d) } else { tlBuf.WriteRune(r) } } w = width } return tlBuf.Bytes(), nil}之后,我將整個內容小寫并應用一系列正則表達式。這種做法非常繁重。我認為我應該能夠在一個循環中完成整個字節,而不是 10 個循環,而且正則表達式很慢。我的第一個想法是修改上面的函數以直接在循環中執行小寫(removeAccentsBytes 函數的第二部分)。但后來我決定我想把它全部組合成一個循環,包括轉換函數。在這一點上,我首先嘗試從轉換源中獲取轉換表,然后通過復制和修改它,但我似乎無法讓它給我它用于轉換的任何表。事實證明,即使 norm.NFD = 1 和 norm.NFC = 0,我還沒有弄清楚它如何解析參數為 0 或 1 的事實,并以某種方式從中獲得轉換表。閱讀它的代碼我可以看到它無論如何都寫得很高效,而且顯然超出了初學者的 Go 技能,所以我認為使用 transform.Chain 添加我自己的轉換器可能會更好。我在任何地方都找不到關于如何編寫transform.Chain 接受的轉換器的任何說明。沒有什么。有沒有人有任何關于我如何為此制作變壓器的信息?
1 回答

不負相思意
TA貢獻1777條經驗 獲得超10個贊
func Chain(t ...Transformer) Transformer
需要一個transform.Transformer數組
type Transformer interface {
Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error)
}
所以你只需要創建一個實現 Transformer 接口的類型:
type DenormalizeAndDeaccent struct {
}
func (t *DenomarlizeAndDeaccent) Transform(dst, src []byte, atEOF bool) (int, int, error) {
result, err := removeAccentsBytesDashes(src)
if err != nil {
return 0, 0, nil
}
n := copy(dst, result)
if n < len(src) {
err = ErrShortDst
}
return n, len(src), err
}
- 1 回答
- 0 關注
- 200 瀏覽
添加回答
舉報
0/150
提交
取消