2017-06-05 6 views
7

तो थोड़ा सा विचार प्रयोग के रूप में मैंने पायथन में एक फ़ंक्शन को कोड किया जो एक समाचार लेख के विषय को खोजने के लिए स्पासी का उपयोग करता है, फिर इसे पसंद के संज्ञा के साथ प्रतिस्थापित करें। समस्या यह है कि यह वास्तव में अच्छी तरह से काम नहीं करता है, और मुझे उम्मीद थी कि इसे बेहतर किया जा सकता है। मैं वास्तव में स्पासी को बिल्कुल समझ नहीं पा रहा हूं, और दस्तावेज़ीकरण को समझना मुश्किल है।एक वाक्य के "विषय" को प्रतिस्थापित करने के लिए स्पासी का उपयोग

पहले, कोड:

doc=nlp(thetitle) 
for text in doc: 
    #subject would be 
    if text.dep_ == "nsubj": 
     subject = text.orth_ 
    #iobj for indirect object 
    if text.dep_ == "iobj": 
     indirect_object = text.orth_ 
     #dobj for direct object 
    if text.dep_ == "dobj": 
     direct_object = text.orth_ 
try: 
    subject 
except NameError: 
    if not thetitle: #if empty title 
     thetitle = "cat" 
     subject = "cat" 
    else: #if unknown subject 
     try: #do we have a direct object? 
      direct_object 
     except NameError: 
      try: #do we have an indirect object? 
       indirect_object 
      except NameError: #still no?? 
       subject = random.choice(thetitle.split()) 
      else: 
       subject = indirect_object 
     else: 
      subject = direct_object 
else: 
    thecat = "cat" #do nothing here, everything went okay 
newtitle = re.sub(r"\b%s\b" % subject, toreplace, thetitle) 
if (newtitle == thetitle) : #if no replacement happened due to regex 
    newtitle = thetitle.replace(subject, toreplace) 
return newtitle 

"बिल्ली" लाइनों भराव लाइनों है कि कुछ भी नहीं करते हैं। "शीर्षक" एक यादृच्छिक समाचार आलेख शीर्षक के लिए एक चर है जो मैं आरएसएस फ़ीड से खींच रहा हूं। "टोरेप्लेस" वेरिएबल है जो स्ट्रिंग को जो कुछ भी मिला है उसे बदलने के लिए स्ट्रिंग रखता है।

"वीडियो गेम है कि टीवी एनिमेटेड होना चाहिए दिखाता है - स्क्रीन शेख़ी" और यहाँ इस बात का displaCy टूटने है::

एक उदाहरण का उपयोग करते हैं https://demos.explosion.ai/displacy/?text=Video%20Games%20that%20Should%20Be%20Animated%20TV%20Shows%20-%20Screen%20Rant&model=en&cpu=1&cph=1

शब्द कोड का निर्णय लिया जा रहा है समाप्त हो गया की जगह " वह ", जो इस वाक्य में एक संज्ञा भी नहीं है, लेकिन ऐसा लगता है कि यादृच्छिक शब्द पसंद फॉलबैक है, क्योंकि यह कोई विषय, अप्रत्यक्ष वस्तु या प्रत्यक्ष वस्तु नहीं ढूंढ सका। मेरी आशा है कि इस उदाहरण में इसे "वीडियो गेम" जैसे कुछ और मिलेगा।

मुझे नोट करना चाहिए कि अगर मैं आखिरी बिट आउट (जो समाचार लेख का स्रोत प्रतीत होता है) displaCy: https://demos.explosion.ai/displacy/?text=Video%20Games%20that%20Should%20Be%20Animated%20TV%20Shows&model=en&cpu=1&cph=1 ऐसा लगता है कि "वह" विषय गलत है, जो गलत है।

इसका विश्लेषण करने का एक बेहतर तरीका क्या है? क्या मुझे पहले उचित संज्ञाएं तलाशनी चाहिए?

+0

यह कोशिश/ब्लॉक को छोड़कर बहुत पाइथनिक नहीं दिखता है, उन्हें किसी को शुरू करने में क्या गलत है और फिर जांचें? –

+0

आपको वाक्य खंडों पर अच्छे नतीजे नहीं दिखाई देंगे, आपके उदाहरण वाक्य में भविष्यवाणी भी नहीं है। –

+0

पुन: प्रयास/ब्लॉक को छोड़कर मैं इसे एक कोड उदाहरण से आधार दे रहा था जिसे मैंने स्पासी का उपयोग करने के लिए पाया था। भविष्यवाणी खराब नहीं होगी? SpaCy का उपयोग करने से वाक्य खंड के विषय को खोजने का कोई बेहतर तरीका है? – SpaceMouse

उत्तर

1

सीधे आपके प्रश्न का उत्तर नहीं दे रहा है, मुझे लगता है कि नीचे दिया गया कोड बहुत अधिक पठनीय है क्योंकि शर्तें स्पष्ट हैं, और जब कोई शर्त मान्य होती है तो else खंड में दफनाया नहीं जाता है। यह कोड कई वस्तुओं वाले मामलों का भी ख्याल रखता है।

आपकी समस्या के लिए: किसी भी प्राकृतिक भाषा प्रसंस्करण उपकरण को वाक्य खंड (या शायद विषय) को वाक्य खंड के खोजने में कठिन समय होगा, उन्हें पूर्ण वाक्यों के साथ प्रशिक्षित किया जाता है। मुझे यह भी यकीन नहीं है कि ऐसे टुकड़ों में तकनीकी रूप से विषयों हैं (हालांकि मैं एक विशेषज्ञ नहीं हूं)। आप अपने मॉडल को प्रशिक्षित करने का प्रयास कर सकते हैं, लेकिन फिर आपको लेबल वाले वाक्यों को प्रदान करना होगा, मुझे नहीं पता कि वाक्य की टुकड़ों के लिए ऐसी चीज पहले से मौजूद है या नहीं।

मुझे पूरा यकीन नहीं है कि आप क्या हासिल करना चाहते हैं, सामान्य संज्ञाओं और सर्वनामों को देखकर संभवतः उस शब्द को शामिल किया जा सकता है जिसे आप प्रतिस्थापित करना चाहते हैं, और पहला दिखाई देने वाला सबसे महत्वपूर्ण है।

import spacy 
import random 
import re 
from collections import defaultdict 

def replace_subj(sentence, nlp): 
    doc = nlp(sentence) 
    tokens = defaultdict(list) 

    for text in doc: 
     tokens[text.dep_].append(text.orth_) 

    if not sentence: 
     return "cat" 

    if "nsubj" in tokens: 
     subject = tokens["nsubj"][0] 
    elif "dobj" in tokens: 
     subject = tokens["dobj"][0] 
    elif "iobj" in tokens: 
     subject = tokens["iobj"][0] 
    else: 
     subject = random.choice(sentence.split()) 

    return re.sub(r"\b{}\b".format(subject), "cat", sentence) 

if __name__ == "__main__": 
    sentence = """Video Games that Should Be Animated TV Shows - Screen Rant""" 

    nlp = spacy.load("en") 
    print(replace_subj(sentence, nlp)) 
संबंधित मुद्दे

 संबंधित मुद्दे