Назначение более одного слова для узла в графе с использованием networkx и matplotlib - PullRequest
0 голосов
/ 08 апреля 2019

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

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

1 Ответ

0 голосов
/ 10 апреля 2019

В вашем 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()
...