#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()