Skip to content

Instantly share code, notes, and snippets.

@huacnlee
Created August 23, 2023 08:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save huacnlee/25731547eb72c25e44988f76504d1434 to your computer and use it in GitHub Desktop.
Save huacnlee/25731547eb72c25e44988f76504d1434 to your computer and use it in GitHub Desktop.
Go 代码 Aho-Corasick 算法从文本中匹配关键词
package main
import (
"fmt"
"time"
)
type Node struct {
children map[rune]*Node
fail *Node
keywords []string
}
func NewNode() *Node {
return &Node{
children: make(map[rune]*Node),
fail: nil,
keywords: nil,
}
}
func (n *Node) AddKeyword(keyword string) {
node := n
for _, char := range keyword {
if _, ok := node.children[char]; !ok {
node.children[char] = NewNode()
}
node = node.children[char]
}
node.keywords = append(node.keywords, keyword)
}
func (n *Node) BuildFailPointers() {
queue := []*Node{}
for _, child := range n.children {
queue = append(queue, child)
child.fail = n
}
for len(queue) > 0 {
current := queue[0]
queue = queue[1:]
for char, child := range current.children {
failNode := current.fail
for failNode != nil && failNode.children[char] == nil {
failNode = failNode.fail
}
if failNode == nil {
child.fail = n
} else {
child.fail = failNode.children[char]
child.keywords = append(child.keywords, failNode.children[char].keywords...)
}
queue = append(queue, child)
}
}
}
func FindKeywords(text string, root *Node) map[string][]int {
result := make(map[string][]int)
node := root
for i, char := range text {
for node != nil && node.children[char] == nil {
node = node.fail
}
if node == nil {
node = root
continue
}
node = node.children[char]
for _, keyword := range node.keywords {
startIndex := i - len(keyword) + 1
if _, ok := result[keyword]; !ok {
result[keyword] = []int{}
}
result[keyword] = append(result[keyword], startIndex)
}
}
return result
}
func main() {
keywordList := []string{"AMD", "英伟达", "利润率", "毛利率", "AI", "微软", "巨头", "上市", "芯片"}
root := NewNode()
for _, keyword := range keywordList {
root.AddKeyword(keyword)
}
root.BuildFailPointers()
text := `英伟达将在周三美股盘后公布 2024 财年第二财季(截至 7 月 31 日的 3 个月)业绩。
英伟达已将自己定位为人工智能芯片市场的赢家,目前该公司在该市场的份额超过 80%。
上次财报发布后,英伟达股价大涨超 24%,随后一路走高。
目前,分析师对英伟达财报抱有超高的预期,但如果公司不能实现目标,可能会严重阻碍 AI 热潮,并给从微软、谷歌到 Meta 和 AMD 等科技巨头带来冲击。
市场对英伟达很乐观
FactSet 调查的分析师预计,英伟达二季度每股收益 2.08 美元,上年同期每股收益为 0.51 美元。
根据 Refinitiv 的数据,分析师普遍预计,英伟达季度收入将增长 66%,至 111.3 亿美元;而英伟达此前预估 Q2 营收将超过 110 亿美元,同比增幅 “大增五成以上”。
就在今年 5 月 24 日,AI 芯片龙头英伟达发布了 Q1 季报:第一财季营收 71.9 亿美元,同比-13%/环比 +19%,毛利率为 66.8%;净利润 20.4 亿美元,同比上涨 26%。
分析师看好英伟达长期发展
一些分析师仍表示,尽管供应方面存在僵局,但英伟达股价仍有上涨空间。
巴克莱表示,英伟达已经 “垄断了人工智能繁荣的经济,没有明显的竞争对手紧随其后”。
分析师称,英伟达的芯片将在未来助力人工智能技术的发展,“云资本支出预算正流向人工智能。”
Wedbush 分析师 Matt Bryson 称,"我们认为英伟达业绩/财测不需要达到预期的上沿。"
“由于 AI 的需求在过去一个季度大幅上升,而且目前没有与英伟达竞争的芯片商,任何未满足的需求都会被推到未来的季度,从而推动未来的销售和每股收益,” 他继续说道。
Synovus 分析师也看好英伟达针对数据中心的业务,但也表示,英伟达 1 万亿美元的估值 “不适合胆小的人”。
尽管本季度对其人工智能芯片的需求无疑将保持强劲,但在其主要供应商的预测令人失望之后,某些投资者正在为英伟达令人失望的盈利指引做准备。
股价会怎么走?
数据中心业务是英伟达迄今为止最大的收入来源,占上季度总收入的 60%,因此它无疑也将成为盈利的最大推动力。
过去几个季度,英伟达的净利润率一直在反弹。
投资者应密切关注英伟达的供应链问题,以及如何成功地将更高的供应链成本转嫁给客户。这将是未来盈利前景及其估值的关键决定因素。
英伟达最大的风险因素之一仍然是其估值,股价目前是明年(2025 财年)每股收益的 46 倍以上。
Nexus Research 倾向于等到英伟达财报公布后才买入,以获得更清晰的前景。
然而,鉴于供应紧张的迹象,英伟达不太可能再次提供大超预期的盈利指引数据,这意味着该股在财报发布后不太可能再次上涨 30%。`
startTime := time.Now()
// Perform keyword search
result := FindKeywords(text, root)
elapsedTime := time.Since(startTime)
fmt.Printf("Keyword Search Result: %+v\n", result)
fmt.Printf("Elapsed Time: %s\n", elapsedTime)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment