为了账号安全,请及时绑定邮箱和手机立即绑定

字符串的词库:因为起始字符太多,需要用不等于逻辑拆分

字符串的词库:因为起始字符太多,需要用不等于逻辑拆分

Go
胡说叔叔 2023-05-15 15:39:19
我有一个 .dat 文件,它是一个包含大约 30 万行的字典/词库对于每个单词,它下面的字符串开头的括号中的单词是同义词库的备选词,括号中的单词是类型。所以是名词或形容词。例如:acceptant|1(adj)|acceptive|receptive acceptation|3(noun)|acceptance(noun)|word meaning|word sense|sense|signified(noun)|adoption|acceptance|espousal|blessing|approval|approvingaccepted|6(adj)|recognized|recognised|acknowledged (adj)|undisputed|uncontroversial |noncontroversial(adj)|standard (adj)|acceptable|standard |received(adj)|established |constituted(adj)|received|conventional accepting|1(adj)|acceptive 所以在上面有 4 个来自字典的单词,但是每个单词都有多个不同的同义词库条目我想使用以下方式拆分字符串:strings.Split(dictionary, !"(")意思是任何不是“(”字符的东西。这是因为它是一本包含俚语和缩写等等的广泛词典。但我无法弄清楚如何使用不等于运算符有谁知道如何使用不等于逻辑的拆分?或者任何人都可以提出一些聪明的替代想法吗?
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

package main


import (

    "bufio"

    "bytes"

    "fmt"

    "os"

)


func main() {

    file, _ := os.Open("dic.dat")

    scanner := bufio.NewScanner(file)

    for scanner.Scan() {

        data := scanner.Bytes()

        if bytes.HasPrefix(data, []byte("(")) {

            continue

        }

        line := scanner.Text()

        fmt.Println(line)

    }

}

输出:


acceptant|1

acceptation|3

accepted|6

accepting|1

按照设计,Go 代码应该是高效的。Go 标准库测试包包含一个基准功能。


避免不必要的转换和分配很重要。例如,将从文件中读取的字节片转换为字符串、分配和复制。


在这种情况下,我们只需要将接受的数据转换为字符串即可。例如,更喜欢字节而不是文本。


$ go test dict_test.go -bench=.

BenchmarkText-4      500    2486306 ns/op    898528 B/op    14170 allocs/op

BenchmarkBytes-4    1000    1489828 ns/op     34080 B/op      609 allocs/op

$

样本基准数据:


KEY: Aback.

SYN: Backwards, rearwards, aft, abaft, astern, behind, back.

ANT: Onwards, forwards, ahead, before, afront, beyond, afore.

=

KEY: Abandon.

SYN: Leave, forsake, desert, renounce, cease, relinquish,

discontinue, castoff, resign, retire, quit, forego, forswear,

depart from, vacate, surrender, abjure, repudiate.

ANT: Pursue, prosecute, undertake, seek, court, cherish, favor,

protect, claim, maintain, defend, advocate, retain, support, uphold,

occupy, haunt, hold, assert, vindicate, keep.

=

dict_test.go:


package main


import (

    "bufio"

    "bytes"

    "fmt"

    "io/ioutil"

    "os"

    "strings"

    "testing"

)


func BenchmarkText(b *testing.B) {

    b.ReportAllocs()

    for N := 0; N < b.N; N++ {

        file := bytes.NewReader(benchData)

        scanner := bufio.NewScanner(file)

        for scanner.Scan() {

            line := scanner.Text()

            if !strings.HasPrefix(line, "KEY") {

                continue

            }

            _ = line // process line

        }

        if err := scanner.Err(); err != nil {

            b.Fatal(err)

        }

    }

}


func BenchmarkBytes(b *testing.B) {

    b.ReportAllocs()

    for N := 0; N < b.N; N++ {

        file := bytes.NewReader(benchData)

        scanner := bufio.NewScanner(file)

        for scanner.Scan() {

            data := scanner.Bytes()

            if !bytes.HasPrefix(data, []byte("KEY")) {

                continue

            }

            line := scanner.Text()

            _ = line // process line

        }

        if err := scanner.Err(); err != nil {

            b.Fatal(err)

        }

    }

}


var benchData = func() []byte {

    // A Complete Dictionary of Synonyms and Antonyms by Samuel Fallows

    // http://www.gutenberg.org/files/51155/51155-0.txt

    data, err := ioutil.ReadFile(`/home/peter/dictionary.51155-0.txt`)

    if err != nil {

        panic(err)

    }

    return data

}()


查看完整回答
反对 回复 2023-05-15
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

package main


import (

    "bufio"

    "fmt"

    "os"

    "strings"

)


func main() {


    file, _ := os.Open("dic.dat")

    scanner := bufio.NewScanner(file)

    for scanner.Scan() {

        line := scanner.Text()

        if strings.HasPrefix(line, "(") {

            continue

        }

        fmt.Println(line)

    }


}


查看完整回答
反对 回复 2023-05-15
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信