首页 > 解决方案 > 使用 networkx 和 matplotlib 为图中的节点分配多个单词

问题描述

我想通过根据分配给每个单词的标签将单词分配给节点来为句子创建图表。如果单词是专有名词,它将被分配到主语列表,如果单词是名词,它将被分配到宾语列表,如果单词是动词,它将被分配到动词列表。

我在 Jupyter Notebook 中使用 Python 2.7。

sentence_list=['Arun Mehta drinks milk']
tag_list={'Arun':'NP','Mehta':'NP','drinks':'VF','milk':'NN'}
tag_list_keys = tag_list.keys()

subject_list=[]
object_list=[]
verb_list=[]

def classify(item):

    if item in tag_list_keys:

        if tag_list[item] == 'NP': subject_list.append(item)
        if tag_list[item] == 'NN': object_list.append(item)
        if tag_list[item] == 'VF': verb_list.append(item)


def extract(item):

    item_split = item.split(' ')
    map(classify, item_split)


map(extract, sentence_list)

print('SUBJECT:',subject_list)
print('OBJECT',object_list)                 
print('VERB',verb_list)


%matplotlib notebook

import networkx as nx
import matplotlib.pyplot as plt


G = nx.Graph()

for i in range(3):
    G.add_node(object_list[i])
    G.add_node(verb_list[i])
    G.add_node(subject_list[i])

    G.add_edge(verb_list[i],object_list[i])
    G.add_edge(subject_list[i],verb_list[i])

nx.draw(G, with_labels= True)

plt.show()

预期输出应具有三个节点,其中一个节点为“Arun Mehta”,第二个节点为“drinks”,第三个节点为“milk”。有人可以建议需要做什么才能在一个节点中获得两个或更多单词吗?

标签: python-2.7matplotlibjupyter-notebooknetworkx

解决方案


在你的extract方法中,你在每个空间都分裂。这就是为什么您的图表中只有单个单词的原因。您可能想检查两个相邻的单词是否是主题并再次加入它们。

为了回答您的基本问题,networkx 支持

import networkx as nx
G = nx.Graph()
G.add_node('Arun Mehta')
print(G.nodes)

输出:['Arun Mehta']

我已经修改了您的代码以加入两个相邻的主题并对其进行了一些修改以使用 python 3

sentence_list=['Arun Mehta drinks milk']
tag_list={'Arun':'NP','Mehta':'NP','drinks':'VF','milk':'NN'}
tag_list_keys = tag_list.keys()

subject_list=[]
object_list=[]
verb_list=[]
list_by_tag = {'NP':subject_list,'NN':object_list, 'VF':verb_list}

def classify(items):

    last_tag = tag_list[items[0]]
    complete_item = items[0]

    for item in items[1:]:

        current_tag = tag_list[item]

        if current_tag == last_tag:
            complete_item = item + " " + complete_item
        else:
            # append last item
            list_by_tag[last_tag].append(complete_item)
            # save current item and tag
            complete_item = item
            last_tag = current_tag

    # care about last element of the list
    list_by_tag[last_tag].append(complete_item)


def extract(item):

    item_split = item.split(' ')
    classify(item_split)


list(map(extract, sentence_list))

print('SUBJECT:',subject_list)
print('OBJECT',object_list)                 
print('VERB',verb_list)


%matplotlib notebook

import networkx as nx
import matplotlib.pyplot as plt


G = nx.Graph()

for i in range(1):
    G.add_node(object_list[i])
    G.add_node(verb_list[i])
    G.add_node(subject_list[i])

    G.add_edge(verb_list[i],object_list[i])
    G.add_edge(subject_list[i],verb_list[i])

nx.draw(G, with_labels= True)

plt.show()

推荐阅读