python-2.7 - 使用 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”。有人可以建议需要做什么才能在一个节点中获得两个或更多单词吗?
解决方案
在你的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()
推荐阅读
- php - 如何显示表单中的复选框值并显示为 pdf php?
- javascript - 通过 HTTPS 的 Web 套接字
- julia - 如何在 Julia 中将字典值设置为零
- java - 反向列表
- > 使用集合
- openstack - Devstack 安装错误 sudo systemctl start devstack@sl-api.service
- c - 如何正确写入日志文件?
- sql - 如何在不丢失右表列中的值的情况下使用左连接添加其他列?
- node.js - 节点模块 Knex.js 和 browserify 问题
- mysql - 得到“java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long”错误
- angular - 角表:当我放 ng if 时,行为空