आपकी समस्या आसानी से एक ग्राफ समस्या के रूप में कल्पना की जा सकती है जहां हमें दो नोड्स के बीच सबसे छोटा रास्ता खोजना है।
ग्राफ में अपने निर्भरता पार्स को बदलने के लिए, हमें पहले इस तथ्य से निपटना होगा कि यह एक स्ट्रिंग के रूप में आता है। आप इस प्राप्त करना चाहते हैं:
'nsubj(are-5, Robots-1)\nxsubj(remind-8, Robots-1)\namod(culture-4, popular-3)\nprep_in(Robots-1, culture-4)\nroot(ROOT-0, are-5)\nadvmod(are-5, there-6)\naux(remind-8, to-7)\nxcomp(are-5, remind-8)\ndobj(remind-8, us-9)\ndet(awesomeness-12, the-11)\nprep_of(remind-8, awesomeness-12)\namod(agency-16, unbound-14)\namod(agency-16, human-15)\nprep_of(awesomeness-12, agency-16)'
इस तरह देखने के लिए:
[('are-5', 'Robots-1'), ('remind-8', 'Robots-1'), ('culture-4', 'popular-3'), ('Robots-1', 'culture-4'), ('ROOT-0', 'are-5'), ('are-5', 'there-6'), ('remind-8', 'to-7'), ('are-5', 'remind-8'), ('remind-8', 'us-9'), ('awesomeness-12', 'the-11'), ('remind-8', 'awesomeness-12'), ('agency-16', 'unbound-14'), ('agency-16', 'human-15'), ('awesomeness-12', 'agency-16')]
इस तरह आप networkx मॉड्यूल से एक ग्राफ निर्माता को टपल सूची फ़ीड कर सकते हैं कि सूची का विश्लेषण करेगा और एक ग्राफ का निर्माण आपके लिए, प्लस आपको एक साफ विधि प्रदान करता है जो आपको दो दिए गए नोड्स के बीच सबसे कम पथ की लंबाई देता है।
आवश्यक आयात
import re
import networkx as nx
from practnlptools.tools import Annotator
वांछित टपल सूची प्रारूप में अपने स्ट्रिंग प्राप्त करने के लिए कैसे
annotator = Annotator()
text = """Robots in popular culture are there to remind us of the awesomeness of unbound human agency."""
dep_parse = annotator.getAnnotations(text, dep_parse=True)['dep_parse']
dp_list = dep_parse.split('\n')
pattern = re.compile(r'.+?\((.+?), (.+?)\)')
edges = []
for dep in dp_list:
m = pattern.search(dep)
edges.append((m.group(1), m.group(2)))
ग्राफ निर्माण कैसे
graph = nx.Graph(edges) # Well that was easy
कैसे की गणना करने के कम से कम पथ की लंबाई
print(nx.shortest_path_length(graph, source='Robots-1', target='awesomeness-12'))
यह स्क्रिप्ट, पता चलता है कि कम से कम पथ निर्भरता पार्स दिया लंबाई 2 की वास्तव में है जब से तुम remind-8
माध्यम से जा रहा द्वारा
awesomeness-12
को
Robots-1
से प्राप्त कर सकते हैं
1. xsubj(remind-8, Robots-1)
2. prep_of(remind-8, awesomeness-12)
यदि आपको यह परिणाम पसंद नहीं है, तो आप कुछ निर्भरताओं को फ़िल्टर करने के बारे में सोचना चाहेंगे, इस मामले में ग्राफ में xsubj
निर्भरता को जोड़ने की अनुमति नहीं है।
हाय @ सेन, मैं nltk का उपयोग करके वाक्य के लिए एक समान वृक्ष संरचना कैसे प्राप्त कर सकता हूं? मेरे पास वर्तमान में कोई ग्रामर नहीं है, और 'पेड़बैंक' व्याकरण का उपयोग करके, मुझे कुछ शब्दों की त्रुटि देता है जो उत्पादन सूची में मौजूद नहीं हैं। धन्यवाद। – skadoosh
@skadoosh Acutally, एनएलटीके का उपयोग करके ऐसी अच्छी प्रस्तुति मिल रही है मुश्किल है। मैं स्पासी का उपयोग करने का सुझाव देता हूं। – Sean