2012-10-22 10 views
5

मैं एक ऐसी प्रणाली पर काम कर रहा हूं जो आयातित फ़ाइलों को अन्य भाषाओं में स्थानीयकृत करने की अनुमति देता है।तारों में समानता को पहचानना

यह एमवीसी 3, एंटिटीफ्रेमवर्क, LINQ, इत्यादि का लटका पाने के लिए ज्यादातर निजी परियोजना है। इसलिए मुझे अंतिम परिणाम मसाला देने के लिए कुछ पागल चीजें करना पसंद है, उन चीजों में से एक समान तारों की पहचान होगी।

कल्पना कीजिए कि आप तार के निम्नलिखित सूची है - एक खेल मैंने पहले भी साथ काम किया है से उधार लिया:

  • Megabeth: पवित्र रोलर वर्दी - प्रमुख, धड़ शामिल है, और पैर
  • Megabeth: पवित्र रोलर वर्दी प्रमुख
  • Megabeth: पवित्र रोलर वर्दी पैर
  • Megabeth: पवित्र रोलर वर्दी धड़
  • Megabeth: PAX पूर्व 2012 वर्दी - शामिल प्रमुख, धड़, और पैर
  • Megabeth: PAX पूर्व 2012 वर्दी प्रमुख
  • Megabeth: PAX पूर्व 2012 वर्दी पैर
  • Megabeth: PAX पूर्व 2012 वर्दी धड़

आप देख सकते हैं, एक बार उन पहले 4 तार का अनुवाद किया है, 4 शेयर समानता का एक बहुत कुछ के बाद, इस मामले में:

  • Megabeth
  • वर्दी
  • शामिल प्रमुख, धड़, और पैर
  • प्रमुख
  • पैर
  • धड़

पर विचार करें पहले 4 तार वास्तव में पहले से ही अनुवाद किया जाता है, जब कोई उपयोगकर्ता सूची से 5 वीं स्ट्रिंग चयन करता है, किस तरह का एल्गोरिदम या तकनीक मैं उपयोगकर्ता को "समान स्ट्रिंग्स" के उप-शीर्षलेख के तहत पहली स्ट्रिंग (और संभावित रूप से अन्य) दिखाने के लिए उपयोग कर सकता हूं?

संपादित करें - लेवेनशेटिन दूरी पर एक छोटी टिप्पणी: मैं वर्तमान में डेटाबेस में 10k स्ट्रिंग को लक्षित कर रहा हूं। लेवेनशेटिन दूरी स्ट्रिंग प्रति स्ट्रिंग की तुलना करता है, इसलिए इस मामले में 10k x (10k -1) संभावित संयोजन। मैं इसे एक व्यवहार्य तरीके से कैसे पहुंचाऊंगा? क्या कोई बेहतर समाधान है कि यह विशेष एल्गोरिदम?

+1

दिलचस्प सवाल। मुझे नहीं पता कि इसका जवाब कहां से शुरू करना है, लेकिन बीमार हैं और देखो। – Gallen

+0

दूरी संपादित करें। जिसमें कई किस्में हैं। और काफी सीधे आगे। यदि आपका मैट्रिक्स बड़ा हो तो कम्प्यूटेशनल रूप से महंगा हो सकता है। – DarthVader

+0

आप सभी तारों को जोड़ सकते हैं, फिर सफेद स्थान (रेगेक्स का उपयोग करके) द्वारा विभाजित कर सकते हैं, फिर इसे 'डिस्टिंट()' के साथ लिनक्स करें और प्रतिस्थापन के साथ अनुवाद करें। इसके साथ समस्या यह है कि सभी भाषाएं शब्द के लिए शब्द का अनुवाद नहीं करती हैं। – Jay

उत्तर

5

आप Levenshtein Distance पर देख सकते हैं। एक निश्चित दहलीज के नीचे वाले लोगों को समान माना जाएगा। समान दो स्ट्रिंग्स की दूरी शून्य होगी।

Rosetta Code पर अन्य भाषाओं के साथ सी # कार्यान्वयन है।

+0

+1, सिर्फ लेवेनशेटिन की सिफारिश करने जा रहा था, आपने मुझे – CaffGeek

+0

पर मार दिया। वास्तव में उस एल्गोरिदम में आ गया है लेकिन स्पष्ट रूप से नाम भूल गया, धन्यवाद। मैं अधिक उत्तरों के लिए उत्सुक हूं, इसलिए मैं इसे थोड़ा सा खोल रहा हूं;) –

+0

यह ठीक है, मुझे यह देखने में भी दिलचस्पी है कि किसी और के पास कोई अन्य समाधान है :) – keyboardP

0

यह डेटा के आकार और शब्दावली कितना समृद्ध होगा पर निर्भर करेगा। यहां पहला विचार है: स्ट्रिंग्स पर शब्दों का नक्शा बनाएं, फिर शब्द जोड़े के दूसरे मानचित्र को पर स्ट्रिंग करें और शायद यदि डेटा तारों के लिए स्ट्रिंग ट्रिपलेट का विशाल मानचित्र नहीं है। मैपिंग को हटाएं जो एक स्ट्रिंग पर इंगित करता है (यह नाटकीय रूप से ट्रिपल मैपिंग की संख्या को कम करेगा)। डिस्क बनाने या डेटाबेस में परिणामस्वरूप शब्दकोश को सहेजने में समय लगता है।

अब एक स्ट्रिंग दी गई है, इसे जल्दी से शब्दों, शब्द जोड़े और तीन गुना में विभाजित करने और इससे संबंधित सभी तारों को देखने में सक्षम होना चाहिए। आपको एक तिहाई मिलान बनाम 4 शब्द मिलान करने के लिए वजन देने के साथ खेलना होगा। अर्थात। "मैं एक बूढ़ा आदमी हूं" "एक बूढ़े आदमी ने गाजर खा लिया" या "आदमी ने तीर के साथ पुराने कुत्ते को मार डाला" (तीन गुना मैच की तरह लगता है) अधिक है।

अद्यतन: यदि यह एक Microsoft SQL सर्वर डेटाबेस में है, तो आप पूर्ण पाठ खोज सुविधा के साथ खेल सकते हैं। मैंने कभी कोशिश नहीं की। आपको Lucene पर भी एक नज़र डालना चाहिए।

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