【问题标题】:Assigning more than one word to a node in a graph using networkx and matplotlib使用 networkx 和 matplotlib 为图中的节点分配多个单词
【发布时间】:2019-08-29 21:56:38
【问题描述】:

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

我在 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.7 matplotlib jupyter-notebook networkx


    【解决方案1】:

    在您的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()
    

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2016-07-15
      相关资源
      最近更新 更多