Присвоение более одного слова узлу в графике с использованием networkx и matplotlib

#python-2.7 #matplotlib #jupyter-notebook #networkx

#python-2.7 #matplotlib #jupyter-ноутбук #networkx

Вопрос:

Я хочу создать график для предложения, назначив слова узлам на основе тега, присвоенного каждому слову. Если слово является именем собственным, оно будет присвоено списку объектов, если слово является существительным, оно будет присвоено списку объектов, а если слово является глаголом, оно будет присвоено списку глаголов.

Я использую Python 2.7 в Jupyter Notebook.

 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’ в третьем узле. Может кто-нибудь, пожалуйста, подсказать, что нужно сделать, чтобы получить два или более слов в одном узле?

Ответ №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()