- समाधान 1:
एक एबेकस पर मोती के रूप में अपने वाक्य में इन टुकड़ों का थिंक चलें, प्रत्येक एक आंशिक स्ट्रिंग से मिलकर मनका, मोती के साथ क्रमपरिवर्तन उत्पन्न करने के लिए बाएं या दाएं स्थानांतरित किया जा सकता है। प्रत्येक टुकड़े की स्थिति दो आसन्न टुकड़ों के बीच तय की जाती है। वर्तमान मामले में, मोती होगा:
क) मनके एक इकाई है, इसलिए हम "अधिक" के मनका यानी क्रमपरिवर्तन भीतर क्रमपरिवर्तन के बारे में परवाह नहीं है:
(more)(recen)(t)(ly)(the)(develop)(ment,)(wh)(ich)(is)(a)(po)(ten)(t)
2 subproblems हल करती है संभव नहीं है
बी) मोतियों का क्रम स्थिर है, केवल उनके बीच अंतर बदलता है। यानी "अधिक" हमेशा "रिकेन" से पहले होगा और इसी तरह। कैसे अपने प्रासंगिक शब्दकोश से कई शब्दों के वे होते हैं, सबसे सही परिणाम आसानी से फ़िल्टर किया जा सकता के आधार पर फिर इन क्रमपरिवर्तन स्कोर
morerecentlythedevelopment,which is a potent
morerecentlythedevelopment,which is a poten t
morerecentlythedevelop ment, wh ich is a po tent
morerecentlythedevelop ment, wh ich is a po ten t
morerecentlythe development,whichisapotent
:
अब, इन मोती, जो की तरह उत्पादन दे देंगे के सभी क्रमपरिवर्तन उत्पन्न बाहर। more recently the development, which is a potent
स्कोर से अधिक morerecentlythedevelop ment, wh ich is a po ten t
कोड जो मोती की क्रमचय हिस्सा है:
import re
def gen_abacus_perms(frags):
if len(frags) == 0:
return []
if len(frags) == 1:
return [frags[0]]
prefix_1 = "{0}{1}".format(frags[0],frags[1])
prefix_2 = "{0} {1}".format(frags[0],frags[1])
if len(frags) == 2:
nres = [prefix_1,prefix_2]
return nres
rem_perms = gen_abacus_perms(frags[2:])
res = ["{0}{1}".format(prefix_1, x) for x in rem_perms] + ["{0} {1}".format(prefix_1, x) for x in rem_perms] + \
["{0}{1}".format(prefix_2, x) for x in rem_perms] + ["{0} {1}".format(prefix_2 , x) for x in rem_perms]
return res
broken = "more recen t ly the develop ment, wh ich is a po ten t"
frags = re.split("\s+",broken)
perms = gen_abacus_perms(frags)
print("\n".join(perms))
डेमो: http://ideone.com/pt4PSt
- समाधान # 2 :
मैं एक वैकल्पिक दृष्टिकोण का सुझाव दूंगा जो पहले से ही समस्याओं पर काम कर रहे लोगों द्वारा विकसित टेक्स्ट विश्लेषण खुफिया का उपयोग करता है और डेटा के बड़े कॉर्पस पर काम करता है जो शब्दकोश और व्याकरण पर निर्भर करता है। खोज यन्त्र।
मुझे ऐसे सार्वजनिक/भुगतान एपिस के बारे में अच्छी जानकारी नहीं है, इसलिए मेरा उदाहरण Google परिणामों पर आधारित है।
- आप एक से अधिक गुजरता के लिए, Google को आपकी अमान्य शर्तों डाल रख सकते हैं, और कुछ अपने देखने शब्दकोश के आधार पर स्कोर के लिए परिणामों का मूल्यांकन रखें:
गूगल इस्तेमाल करने की कोशिश करते हैं।
यह outout एक दूसरे पारित करने के लिए प्रयोग किया जाता है: यहाँ अपने पाठ का 2 गुजरता का उपयोग करके दो प्रासंगिक outputs हैं
जो तुम "के रूप में रूपांतरण देता है "हाल ही में विकास, जो एक शक्तिशाली है"।
रूपांतरण सत्यापित करने के लिए, आपको कुछ समानता एल्गोरिदम का उपयोग करना होगा और अमान्य/न तो अच्छे नतीजे फ़िल्टर करने के लिए स्कोरिंग करना होगा।
एक कच्ची तकनीक difflib का उपयोग कर सामान्यीकृत तारों की तुलना का उपयोग कर सकती है।
>>> import difflib
>>> import re
>>> input = "more recen t ly the develop ment, wh ich is a po ten t "
>>> output = "more recently the development, which is a potent "
>>> input_norm = re.sub(r'\W+', '', input).lower()
>>> output_norm = re.sub(r'\W+', '', output).lower()
>>> input_norm
'morerecentlythedevelopmentwhichisapotent'
>>> output_norm
'morerecentlythedevelopmentwhichisapotent'
>>> difflib.SequenceMatcher(None,input_norm,output_norm).ratio()
1.0
लेकिन यह एक से अधिक क्रम में वाक्य व्यवस्थित किए जाने पर कैसे काम करता है? "पेन माइग htier था एन एन ord" – DhruvPathak
सुरुचिपूर्ण दृष्टिकोण, लेकिन सभी रिक्त स्थान को छोड़कर इसे एक कठिन समस्या में बदल जाता है। ओपीएस विवरण ("अवांछित रिक्त स्थान हटाएं") बताता है कि रिक्त स्थान कभी गायब नहीं होते हैं; यदि यह सही है, तो आपको शब्द ब्रेक के लिए कभी भी एक टुकड़े के अंदर नहीं दिखना चाहिए। – alexis
@alexis, आप सही हैं, मुझे लगता है कि कम से कम सभी विभाजनों के बजाय विभिन्न जोड़ों की संभावनाओं की गणना करके प्रदर्शन को कम से कम क्रम में सुधार किया जा सकता है। मैं शायद बाद में अपने जवाब को सुधारने के लिए वापस आऊंगा। – miku