【发布时间】:2009-06-02 17:55:02
【问题描述】:
在过去的一年里,我一直在解析扑克手牌历史,并且对一般的解析有了很多了解。
我们从正则表达式开始,但很快意识到这并不容易扩展。 我们跳过了从 ruby 到 c++ 的语言,最后意识到必须改变的是算法。
我们选择了 Boost::Spirit,发现我们的速度以 10 倍以上的原始速度大幅提升。然后我们跳到 java,目前正在使用 antlr 为每个站点创建语法。这绝对是迄今为止最快的方法,而且非常彻底,这很好,因为您确切地知道您在“完整”语法方面的立场。不幸的是,我花了很多时间来处理这些语法——它们工作得非常好,但还不够完美。
无论如何,关于手头问题的背景已经足够了 - 是否有任何我不知道的“异国情调”或鲜为人知的解析技术?我只知道词法分析/解析语法和其他劣等正则表达式/循环方法。
对于那些不熟悉扑克手牌历史的人,我会发布一个,以便您了解其结构。
Full Tilt Poker Game #12037626529: Table durrrr (heads up, deep) - $500/$1000 -
Pot Limit Omaha Hi - 2:00:48 ET - 2009/05/05
Seat 1: durrrr ($196,456.50)
Seat 2: Gus Hansen ($65,499)
durrrr posts the small blind of $500
Gus Hansen posts the big blind of $1,000
The button is in seat #1
*** HOLE CARDS ***
durrrr raises to $3,000
Gus Hansen raises to $9,000
durrrr calls $6,000
*** FLOP *** [3d 4d 7d]
Gus Hansen has 15 seconds left to act
Gus Hansen checks
durrrr checks
*** TURN *** [3d 4d 7d] [Jh]
Gus Hansen checks
durrrr checks
*** RIVER *** [3d 4d 7d Jh] [Ah]
Gus Hansen has 15 seconds left to act
Gus Hansen checks
durrrr has 15 seconds left to act
123stayfree (Observer): GUS I NOW BRING U LUCK
durrrr bets $7,600
Gus Hansen has 15 seconds left to act
Gus Hansen has requested TIME
Hernandez777 (Observer): Gus has the super-duper nuts
Gus Hansen calls $7,600
Podobed45 (Observer): fluuuuuuuuuush
*** SHOW DOWN ***
durrrr shows [Kc 3s Qd As] two pair, Aces and Threes
Gus Hansen mucks
durrrr wins the pot ($33,199.50) with two pair, Aces and Threes
*** SUMMARY ***
Total pot $33,200 | Rake $0.50
Board: [3d 4d 7d Jh Ah]
Seat 1: durrrr (small blind) collected ($33,199.50)
Seat 2: Gus Hansen (big blind) mucked
我很清楚其他收集信息的方法(例如屏幕抓取和 dll 注入),但是仍然需要将手牌历史转换为结构化数据,所以我只关注那些抓取正则表达式/语法等信息...
我想如果我找不到什么我会用 ocamllex/ocamlyacc 重写我们的语法。
更新
fyi:正则表达式速度约为 60 手/秒,而语法处理 600+ 手/秒...在数据全部整理后,整只手转换为 xml...有 20-30 个正则表达式您要解析的每个站点都需要(最后计数)......语法方面的每个站点都有自己的语法,其中包含大量的词法分析器/解析器规则(但它的代码量仍然较小)
我确实有龙书并且一直在阅读它——这让我对使用 ocamllex/ocamlyacc 失去了兴趣....速度是这里的游戏名称..
【问题讨论】:
-
为什么需要快速?人们以人类的速度在扑克中互动,每 10-20 秒左右只产生一行输出。任何机械解析器都应该能够毫无问题地跟上。我希望您在定义语法时遇到更多麻烦;这些日志条目是任意英文吗? ("fluuuuuuush...") 看起来不像事务日志会产生的东西。
-
嘿!这是一种旧思路;有问题的网站不仅适用于一个人或一个机器人——它处理来自数千名用户同时玩牌的手牌历史——许多扑克玩家会玩多桌(玩 3-4-6,甚至 10+ 桌)一次)..所以让我们保守一点,说 3 * 10k/分钟 ~ 大约 30k 手/分钟是这个解析器应该能够做的(当然这才刚刚开始)——无论如何这有点老了问题--我以后可能会再写--暂时不关心它
-
我们在这里谈论的是 PTR 吗? ;)