Python|知识图谱——用Python代码从文本中挖掘信息的强大数据科学技术( 二 )


“在最新的男子单打排名中 , 印度网球选手苏米特?纳加尔(Sumit Nagal)从135名上升了6个名次 , 达到职业生涯中的最好成绩129名 。 这位22岁的选手最近赢得了ATP挑战锦标赛 。 2019年美国网球公开赛中他首次亮相时 , 就在对阵费德勒的比赛中赢得了大满贯 。 纳加尔赢得了第一组比赛 。 (Indian tennis player Sumit Nagal moved up six places from 135to a career-best 129 in the latest men’s singles ranking. The 22-year-oldrecently won the ATP Challenger tournament. He madehis Grand Slam debut against Federer in the 2019 US Open. Nagal won the firstset.)”
我们把上面的段落分成几个句子:
1. 在最新的男子单打排名中 , 印度网球选手苏米特?纳加尔(SumitNagal)从135名上升了6个名次 , 达到职业生涯中的最好成绩129名 。 (Indian tennis player Sumit Nagal moved up six places from135 to a career-best 129 in the latest men’s singles ranking.)
2. 这位22岁的选手最近赢得了ATP挑战锦标赛 。 (The 22-year-old recently won the ATP Challengertournament))
3. 2019年美国网球公开赛中他首次亮相时 , 就在对阵费德勒比赛中赢得了大满贯 。 (Hemade his Grand Slam debut against Federer in the 2019 US Open.)
4. 纳加尔赢得了第一组比赛 。 (Nagalwon the first set.)
在这四个句子中 , 我们将选出第二个和第四个句子 , 因为每个句子都包含一个主语和一个宾语 。 第二句中 , “22岁的选手(22-year-old)”是主语 , 宾语是“ATP挑战赛(ATP Challenger tournament)” 。 第四句中 , 主语是“纳加尔(Nagal)” , “第一组比赛(first set)”是宾语:
Python|知识图谱——用Python代码从文本中挖掘信息的强大数据科学技术文章插图
让机器理解文本是最大的挑战 , 特别是在主语和宾语不止一个的情况下 。 以上面两个句子为例 , 提取句子中的宾语有点棘手 。 你能想到解决这个问题的方法吗?
实体抽取
从句子中提取一个词实体并不是艰巨的任务 。 我们可以借助词性(POS)标签轻松做到这一点 。 名词和专有名词可以是我们的实体 。
然而 , 当一个实体包括多个单词时 , 仅仅借助词性标记是不够的 。 我们需要解析句子间的复杂关系 。 先来获取其中一个句子的依存标记 。 使用流行的spaCy库来完成这个任务:
import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp("The 22-year-old recently won ATP Challenger tournament.")
for tok in doc:
print(tok.text, "...", tok.dep_)
输出:
The… det
22-year … amod
– … punct
old … nsubj
recently … advmod
won … ROOT
ATP … compound
Challenger … compound
tournament … dobj
. … punct
根据依存关系解析器 , 这个句子中的主语(nsubj)是“old” 。 这不是我们想要的实体 。 我们想要的是“22岁的选手(22-year-old)” 。
“22岁的(22-year)”的依存关系标签是amod , 这意味着它是(old)”的修饰语 。 因此 , 应该定义一个规则来提取这样的实体 。
可以是这样的规则:提取主语/宾语及其修饰语 , 并提取它们之间的标点 。
但是再看看句子中的宾语(dobj) 。 它只是“锦标赛(tournament)”而不是“ATP挑战锦标赛(ATPChallenger tournament)” 。 在这句里 , 没有修饰词 , 只有复合词 。
复合词是指不同词组合起来所形成的新术语 , 它们有着和源词不同的意思 。 因此 , 我们可以更新上面的规则----提取主语/宾语及其修饰语、复合词 , 并提取它们之间的标点 。
简而言之 , 我们使用依存句法分析来提取实体 。
提取关系
实体提取仅仅是一半的工作 。 想要建立知识图谱 , 需要边来连接各个节点(实体) 。 这些边表示节点之间的关系 。
回到上一节中的例子 , 选出几句话来构建一个知识图谱:
Python|知识图谱——用Python代码从文本中挖掘信息的强大数据科学技术文章插图
你能猜出这两个句子中主语和宾语的关系吗?
两个句子有相同的关系——“赢得(won)” 。 看看该如何提取这些关系 。 这里将再次使用依存项解析:
doc = nlp("Nagal won the first set.")
for tok in doc:
print(tok.text, "...", tok.dep_)
输出:
Nagal… nsubj
won … ROOT
the … det
first … amod
set … dobj
. … punct
为了提取关系 , 必须找到句子的根(root) , 它也是句子里的动词 。 因此 , 在这个句子里找到的关系就是“赢得(won)” 。
最后 , 这两个句子的知识图谱是这样的:
Python|知识图谱——用Python代码从文本中挖掘信息的强大数据科学技术文章插图
从文本数据构建知识图谱