(2) yo'naltirilgan, vaznsiz grafik
Yuqorida ta'kidlab o'tilganidek, yo'naltirilgan grafikni yaratish uchun biz grafikni qurish usulini biroz o'zgartirishimiz kerak.
Ikki tugun orasidagi chekkaning yo'nalishini bigrammada mos keladigan so'zlarning paydo bo'lish tartibini aniqlaymiz. Shunday qilib, "a grafik" bigrammasi "a" tugunidan "grafik" tuguniga chekka olib keladi. Yaxshiyamki, biz ilgari suratga olgan bigrammalar matndagi asl so'z tartibini allaqachon hisobga olgan (ya'ni, biz ularning tartibini hech qachon maqsadli ravishda o'zgartirmaymiz). Bu shuni anglatadiki, biz o'zgartirishimiz kerak bo'lgan yagona narsa - biz haqiqiy grafik ob'ektini quradigan qism (bu holda, NetworkX bilan), unga qirralarning yo'nalishini hisobga olishni aytish kerak .
Shunday qilib, biz faqat qatorni o'zgartirishimiz kerak:
G = nx.Graph()
Kimga (DiGraph yo'naltirilgan grafikni bildiradi):
G = nx.DiGraph()
Va biz tugatdik.
Tegishli o'zgartirishlar bilan build_graph() asosiy funktsiyasini ishga tushirgandan so'ng, namunaviy hujjatning yo'naltirilgan, tortilmagan grafik syujeti (bu holda, faqat bitta qator). Muallif tomonidan tasvir.
(3) Yo'naltirilgan, vaznli grafik
Nihoyat, oxirgi qism grafikning chetlariga og'irlik qo'shishga mos keladi. Bunday holda, biz har bir chetni hujjatda tegishli bigramma paydo bo'lish soniga qarab tortamiz . Shunday qilib, agar hujjatda "a grafik" bigrammasi 3 marta paydo bo'lsa, "a" va "grafik" tugunlarini (shu yo'nalishda) bog'laydigan yo'naltirilgan chekka 3 ga teng bo'ladi.
Shunday qilib, hujjatda har bir bigram ko'rish sonini hisoblash uchun avval belgilangan munosabatni oluvchini o'zgartirishimiz kerak.
def get_weighted_edges(document):
# in our case, relations are bigrams in sentences
# weights are number of equal bigrams
# use a dict to store number of counts
bigrams = {}
for sent in document:
for i in range(len(sent)-1):
# transform to hashable key in dict
pair = str([sent[i], sent[i+1]])
if pair not in bigrams.keys():
# weight = 1
bigrams[pair] = 1
else:
# already exists, weight + 1
bigrams[pair] += 1
# convert to NetworkX standard form each edge connecting nodes u and v = [u, v, weight]
weighted_edges_format = []
for pair, weight in bigrams.items():
# revert back from hashable format
w1, w2 = eval(pair)
weighted_edges_format.append([w1, w2, weight])
return weighted_edges_format
Va nihoyat, asosiy funktsiyani yangi og'irlikdagi chekka oluvchini hisobga olish uchun moslang. E'tibor bering, tuzilgan grafik avvalgidek DiGraph bo'lib qolmoqda , ammo og'irlikdagi qirralarni qo'shish usuli biroz boshqacha interfeysga ega (boshqa nom).
def build_weighted_digraph(document):
# preprocess document for standardization
pdoc = preprocess_document(doc)
# get graph nodes
nodes = get_entities(pdoc)
# get weighted edges
weighted_edges = get_weighted_edges(pdoc)
# create graph structure with NetworkX
G = nx.DiGraph()
G.add_nodes_from(nodes)
G.add_weighted_edges_from(weighted_edges)
return G
Tegishli o'zgartirishlar bilan build_weighted_graph() asosiy funksiyasini ishga tushirgandan so'ng, namunaviy hujjatning yo'naltirilgan, vaznli grafik syujeti. Muallif tomonidan tasvir.
Do'stlaringiz bilan baham: |