Тезаурус строк: потому что очень много разных начальных символов, нужно использовать Split с не равным логике - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть файл .dat, который представляет собой словарь / тезаурус, содержащий около 300 тыс. Строк

Для каждого слова следующие строки под ним, в начале строки которых есть слово в скобках, являются тезаурусом 'альтернативы со словом в скобках, являющегося типом.Так существительное или прилагательное.Например:

acceptant|1
(adj)|acceptive|receptive 
acceptation|3
(noun)|acceptance
(noun)|word meaning|word sense|sense|signified
(noun)|adoption|acceptance|espousal|blessing|approval|approving
accepted|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 ]

0 голосов
/ 16 декабря 2018

@ Решение MostafaSolati можно улучшить, написав более эффективно.

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
}()
0 голосов
/ 15 декабря 2018
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)
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...