【问题标题】:remove all word in string that contain a word from slice从切片中删除字符串中包含单词的所有单词
【发布时间】:2019-11-20 21:13:19
【问题描述】:

我正在尝试进行主题提取,我所做的是从字符串中删除所有辅助词,我的伪代码是:

topic := make(map[string]int)
auxiliaryWord := []string{"hbs", "habis", "dan", "kapan", "bagaimana", "kita", "kamu", "warga", "pada", "paling", "ga", "gak", "enggak", "tidak", "bukan", "usai", "juga", "yg", "yang", "kpd", "kepada", "nya", "adanya", "jd", "jadi", "sih", "lah", "kan", "photo", "from", "by", "ini", "saja", "utk", "untuk", "lebih", "ternyata", "apa", "sok", "tau", "bagi", "eksis", "keluar", "kk", "kakak"}
for chat := range chats {
    arrWord := chat.Split(chat, " ")
    for word := arrWord {
        if word not in auxiliaryWord {
            if topic[word] not exist {
                topic[word] = 1
            } else {
                topic[word]+= 1
            }
        }
    }
}

我的问题是,有没有更快的方法来做到这一点?

【问题讨论】:

  • 您可以使用map,而不是slice,来保存auxiliaryWord
  • 为什么topicmap[string]int?大型map[string]interface{} 映射的性能降低,因为strings 逃逸到堆中(因为它们包含指针)。您应该对其进行基准测试,但使用 []string 进行查找可能会更快。
  • @minitauros 我需要计算(int)聊天中提到的主题(字符串)有多少
  • 是的,我想在大多数情况下它只会是次要的,如果你想微调一些东西就需要考虑一下 :)

标签: string go slice


【解决方案1】:

只需预先计算 auxilaryWord 以散列,然后进行查找。

package main

import (
    "fmt"
    "strings"
)

var auxilaryWords = []string{"hbs", "habis", "dan", "kapan", "bagaimana", "kita", "kamu", "warga", "pada", "paling", "ga", "gak", "enggak", "tidak", "bukan", "usai", "juga", "yg", "yang", "kpd", "kepada", "nya", "adanya", "jd", "jadi", "sih", "lah", "kan", "photo", "from", "by", "ini", "saja", "utk", "untuk", "lebih", "ternyata", "apa", "sok", "tau", "bagi", "eksis", "keluar", "kk", "kakak"}
var auxHash = map[string]bool{}

func CountTopics(chatWords []string) map[string]int {
    result := map[string]int{}
    for _, word := range chatWords {
        if !auxHash[word] {
            result[word] += 1
        }
    }
    return result
}

func init() {
    for _, word := range auxilaryWords {
        auxHash[word] = true
    }
}

func main() {
    arrWord := strings.Split(`hai kakak habis makan apa`, " ")
    fmt.Println(CountTopics(arrWord))   
}

https://play.golang.org/p/Wr2gK_zizL0

【讨论】:

  • 你可以只使用 [string]int 的单个映射,测试是否存在并增加它
猜你喜欢
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2019-07-25
  • 2011-06-13
相关资源
最近更新 更多