亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go:為 code.google.com/p/go.text/transform 制作轉換器

Go:為 code.google.com/p/go.text/transform 制作轉換器

Go
慕容森 2021-08-10 16:23:26
一段時間以來,我一直在通過以下方式對文本進行規范化和去重音:// 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

}


查看完整回答
反對 回復 2021-08-10
  • 1 回答
  • 0 關注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號