Python 解析体育比赛数据的自然语言解析器

Python 解析体育比赛数据的自然语言解析器,python,parsing,nlp,Python,Parsing,Nlp,我想为足球比赛设计一个解析器。我在这里使用的术语“自然语言”非常松散,所以请容忍我,因为我对这个领域几乎一无所知 下面是一些我正在使用的示例 (格式:时间|停止和距离|离开|团队|说明): 到目前为止,我已经编写了一个哑解析器,它可以处理所有简单的内容(playID、quarter、time、down&distance、进攻性团队)以及一些脚本,这些脚本可以获取这些数据,并将其净化为上面所示的格式。一行变成一个“Play”对象,存储到数据库中 这里最难的部分(至少对我来说)是解析剧本的描述。以下

我想为足球比赛设计一个解析器。我在这里使用的术语“自然语言”非常松散,所以请容忍我,因为我对这个领域几乎一无所知

下面是一些我正在使用的示例 (格式:时间|停止和距离|离开|团队|说明):

到目前为止,我已经编写了一个哑解析器,它可以处理所有简单的内容(playID、quarter、time、down&distance、进攻性团队)以及一些脚本,这些脚本可以获取这些数据,并将其净化为上面所示的格式。一行变成一个“Play”对象,存储到数据库中

这里最难的部分(至少对我来说)是解析剧本的描述。以下是我想从该字符串中提取的一些信息:

示例字符串:

"Mark Sanchez pass to the left to Shonn Greene for 7 yards to the NYJ44. Tackled by Mike Jenkins."
结果:

turnover = False
interception = False
fumble = False
to_on_downs = False
passing = True
rushing = False
direction = 'left'
loss = False
penalty = False
scored = False
TD = False
PA = False
FG = False
TPC = False
SFTY = False
punt = False
kickoff = False
ret_yardage = 0
yardage_diff = 7
playmakers = ['Mark Sanchez', 'Shonn Greene', 'Mike Jenkins']
我的初始解析器的逻辑是这样的:

# pass, rush or kick
# gain or loss of yards
# scoring play
    # Who scored? off or def?
    # TD, PA, FG, TPC, SFTY?
# first down gained
# punt?
# kick?
    # return yards?
# penalty?
    # def or off?
# turnover?
    # INT, fumble, to on downs?
# off play makers
# def play makers

这些描述可能会变得非常复杂(多次失误和带惩罚的恢复等),我想知道我是否可以利用一些NLP模块。我可能会花几天的时间在一个哑/静态的解析器上,但如果有人对如何使用NLP技术进行解析提出建议,我很想听听他们的意见。

我认为pyparsing在这里非常有用

您的输入文本看起来非常规则(不像真正的自然语言),pyparsing在这方面非常出色。你应该看看

例如,要分析以下句子:

Mat McBriar punts for 32 yards to NYJ14.
Mark Sanchez rush to the right for 3 yards to the NYJ24.
您可以使用以下内容定义解析语句(在文档中查找确切的语法):


pyparsing将使用此模式中断字符串。它还将返回一个字典,其中包含从句子中提取的项目名称、动作和距离

我想pyparsing会工作得很好,但是基于规则的系统非常脆弱。所以,如果你超越足球,你可能会遇到一些麻烦

我认为解决这个问题的更好办法是使用词性标签和球员姓名、位置和其他体育术语的词典(阅读词典)。把它放到你最喜欢的机器学习工具中,找出好的特性,我认为它会做得很好


NTLK是NLP的良好起点。不幸的是,这个领域还不是很发达,也没有一个工具像bam一样,可以解决问题,很简单。

考虑到问题主题,我发现很有趣的是,SO语法高亮显示了所有的人名。。。
Mat McBriar punts for 32 yards to NYJ14.
Mark Sanchez rush to the right for 3 yards to the NYJ24.
name = Group(Word(alphas) + Word(alphas)).setResultsName('name')

action = Or(Exact("punts"),Exact("rush")).setResultsName('action') + Optional(Exact("to the")) + Or(Exact("left"), Exact("right")) )

distance = Word(number).setResultsName("distance") + Exact("yards")

pattern = name + action + Exact("for") +  distance + Or(Exact("to"), Exact("to the")) + Word()