Python 在 nltk.tree 中查找单词
Python locate words in nltk.tree
我正在尝试构建一个 nltk 来获取单词的上下文。我有两句话
sentences=pd.DataFrame({"sentence": ["The weather was good so I went swimming", "Because of the good food we took desert"]})
我想知道"good"这个词指的是什么。我的想法是将句子分块(来自教程 here 的代码),然后查看单词 "good" 和名词是否在同一个节点中。如果不是,则指代前面或后面的名词。
首先,我按照教程中的方式构建 Chunker
from nltk.corpus import conll2000
test_sents = conll2000.chunked_sents('test.txt', chunk_types=['NP'])
train_sents = conll2000.chunked_sents('train.txt', chunk_types=['NP'])
class ChunkParser(nltk.ChunkParserI):
def __init__(self, train_sents):
train_data = [[(t,c) for w,t,c in nltk.chunk.tree2conlltags(sent)]
for sent in train_sents]
self.tagger = nltk.TrigramTagger(train_data)
def parse(self, sentence):
pos_tags = [pos for (word,pos) in sentence]
tagged_pos_tags = self.tagger.tag(pos_tags)
chunktags = [chunktag for (pos, chunktag) in tagged_pos_tags]
conlltags = [(word, pos, chunktag) for ((word,pos),chunktag)
in zip(sentence, chunktags)]
return nltk.chunk.conlltags2tree(conlltags)
NPChunker = ChunkParser(train_sents)
然后,我将其应用到我的句子中:
sentence=sentences["sentence"][0]
tags=nltk.pos_tag(sentence.lower().split())
result = NPChunker.parse(tags)
print result
结果看起来像这样
(S
(NP the/DT weather/NN)
was/VBD
(NP good/JJ)
so/RB
(NP i/JJ)
went/VBD
swimming/VBG)
现在我想"find"单词"good"在哪个节点。除了计算节点和叶子中的单词外,我还没有真正想出更好的方法。单词 "good" 是句子中的第 3 个单词。
stuctured_sentence=[]
for n in range(len(result)):
stuctured_sentence.append(list(result[n]))
structure_length=[]
for n in result:
if isinstance(n, nltk.tree.Tree):
if n.label() == 'NP':
print n
structure_length.append(len(n))
else:
print str(n) +"is a leaf"
structure_length.append(1)
通过总结字数,我知道"good"这个字在哪里
structure_frame=pd.DataFrame({"structure": stuctured_sentence, "length": structure_length})
structure_frame["cumsum"]=structure_frame["length"].cumsum()
有没有更简单的方法来确定单词的节点或叶子并找出"good"指的是哪个单词?
最佳亚历克斯
在叶子列表中找到您的单词是最容易的。然后,您可以将叶索引转换为树索引,这是树下的路径。要查看用 good
分组的内容,请上一级并检查这挑选出的子树。
首先,找出good
在平句中的位置。 (如果您仍然将未标记的句子作为标记列表,则可以跳过此步骤。)
words = [ w for w, t in result.leaves() ]
现在我们找到good
的直线位置,转化为树路径:
>>> position = words.index("good")
>>> treeposition = result.leaf_treeposition(position)
>>> print(treeposition)
(2, 0)
A "treeposition" 是树下的路径,表示为元组。 (NLTK 树可以使用元组和整数进行索引。)要查看 good
的姐妹,请在到达路径终点之前停止一步。
>>> print(result[ treeposition[:-1] ])
Tree('NP', [('good', 'JJ')])
给你。有一个叶子的子树,一对(good, JJ)
。
我正在尝试构建一个 nltk 来获取单词的上下文。我有两句话
sentences=pd.DataFrame({"sentence": ["The weather was good so I went swimming", "Because of the good food we took desert"]})
我想知道"good"这个词指的是什么。我的想法是将句子分块(来自教程 here 的代码),然后查看单词 "good" 和名词是否在同一个节点中。如果不是,则指代前面或后面的名词。
首先,我按照教程中的方式构建 Chunker
from nltk.corpus import conll2000
test_sents = conll2000.chunked_sents('test.txt', chunk_types=['NP'])
train_sents = conll2000.chunked_sents('train.txt', chunk_types=['NP'])
class ChunkParser(nltk.ChunkParserI):
def __init__(self, train_sents):
train_data = [[(t,c) for w,t,c in nltk.chunk.tree2conlltags(sent)]
for sent in train_sents]
self.tagger = nltk.TrigramTagger(train_data)
def parse(self, sentence):
pos_tags = [pos for (word,pos) in sentence]
tagged_pos_tags = self.tagger.tag(pos_tags)
chunktags = [chunktag for (pos, chunktag) in tagged_pos_tags]
conlltags = [(word, pos, chunktag) for ((word,pos),chunktag)
in zip(sentence, chunktags)]
return nltk.chunk.conlltags2tree(conlltags)
NPChunker = ChunkParser(train_sents)
然后,我将其应用到我的句子中:
sentence=sentences["sentence"][0]
tags=nltk.pos_tag(sentence.lower().split())
result = NPChunker.parse(tags)
print result
结果看起来像这样
(S
(NP the/DT weather/NN)
was/VBD
(NP good/JJ)
so/RB
(NP i/JJ)
went/VBD
swimming/VBG)
现在我想"find"单词"good"在哪个节点。除了计算节点和叶子中的单词外,我还没有真正想出更好的方法。单词 "good" 是句子中的第 3 个单词。
stuctured_sentence=[]
for n in range(len(result)):
stuctured_sentence.append(list(result[n]))
structure_length=[]
for n in result:
if isinstance(n, nltk.tree.Tree):
if n.label() == 'NP':
print n
structure_length.append(len(n))
else:
print str(n) +"is a leaf"
structure_length.append(1)
通过总结字数,我知道"good"这个字在哪里
structure_frame=pd.DataFrame({"structure": stuctured_sentence, "length": structure_length})
structure_frame["cumsum"]=structure_frame["length"].cumsum()
有没有更简单的方法来确定单词的节点或叶子并找出"good"指的是哪个单词?
最佳亚历克斯
在叶子列表中找到您的单词是最容易的。然后,您可以将叶索引转换为树索引,这是树下的路径。要查看用 good
分组的内容,请上一级并检查这挑选出的子树。
首先,找出good
在平句中的位置。 (如果您仍然将未标记的句子作为标记列表,则可以跳过此步骤。)
words = [ w for w, t in result.leaves() ]
现在我们找到good
的直线位置,转化为树路径:
>>> position = words.index("good")
>>> treeposition = result.leaf_treeposition(position)
>>> print(treeposition)
(2, 0)
A "treeposition" 是树下的路径,表示为元组。 (NLTK 树可以使用元组和整数进行索引。)要查看 good
的姐妹,请在到达路径终点之前停止一步。
>>> print(result[ treeposition[:-1] ])
Tree('NP', [('good', 'JJ')])
给你。有一个叶子的子树,一对(good, JJ)
。