Created
August 23, 2023 08:21
-
-
Save huacnlee/25731547eb72c25e44988f76504d1434 to your computer and use it in GitHub Desktop.
Go 代码 Aho-Corasick 算法从文本中匹配关键词
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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