में फोल्डिंग द्वारा यूनिकोड स्ट्रिंग मिलान को कार्यान्वित करने के लिए मेरे पास एक वृद्धिशील खोज को लागू करने वाला एक एप्लिकेशन है। मेरे पास मिलान करने के लिए यूनिकोड तारों की एक सूची है और उन्हें किसी दिए गए "कुंजी" स्ट्रिंग से मिलान करें; एक कैटलॉग स्ट्रिंग एक "हिट" है यदि इसमें कुंजी के सभी वर्ण शामिल हैं, क्रम में, और कैटलॉग स्ट्रिंग में कुंजी वर्ण क्लस्टर होने पर यह बेहतर रैंक किया जाता है।पाइथन
वैसे भी, यह ठीक काम करता है और वास्तव में यूनिकोड से मेल खाता है, ताकि "Ost" "Ost Blocket" या "आर Ost" या "आर ö घ सेंट एन" से मेल खाएगी।
वैसे भी, अब मैं फोल्डिंग को कार्यान्वित करना चाहता हूं, क्योंकि कुछ ऐसे मामले हैं जहां कैटलॉग कैरेक्टर जैसे "á" या "é" और मुख्य वर्ण "ए" या "ई" के बीच अंतर करना उपयोगी नहीं है।
उदाहरण के लिए: "ओले" "Olé"
से मेल खाना चाहिए मैं कैसे सबसे अच्छा अजगर में इस यूनिकोड-तह मिलान लागू करते हैं? दक्षता महत्वपूर्ण है क्योंकि मुझे छोटी, दिए गए कुंजी पर हजारों कैटलॉग तारों से मेल खाना पड़ेगा।
इसे इसे ascii में बदलना नहीं है; वास्तव में, एल्गोरिदम की आउटपुट स्ट्रिंग यूनिकोड हो सकती है। इसमें एक चरित्र छोड़ना इसे अलग करने से बेहतर है।
मुझे नहीं पता कि कौन सा जवाब स्वीकार करना है, क्योंकि मैं दोनों का थोड़ा सा उपयोग करता हूं। एनकेएफडी अपघटन को लेना और संयोजन अंकों को हटाने का लगभग पूरा तरीका है, मैं केवल कुछ कस्टम लिप्यंतरण जोड़ता हूं। यहाँ मॉड्यूल है, क्योंकि यह अब दिखता है: (चेतावनी, यूनिकोड वर्ण इनलाइन, शामिल हैं के बाद से यह बहुत अच्छा है कि जिस तरह से संपादित करने के लिए।)
# -*- encoding: UTF-8 -*-
import unicodedata
from unicodedata import normalize, category
def _folditems():
_folding_table = {
# general non-decomposing characters
# FIXME: This is not complete
u"ł" : u"l",
u"œ" : u"oe",
u"ð" : u"d",
u"þ" : u"th",
u"ß" : u"ss",
# germano-scandinavic canonical transliterations
u"ü" : u"ue",
u"å" : u"aa",
u"ä" : u"ae",
u"æ" : u"ae",
u"ö" : u"oe",
u"ø" : u"oe",
}
for c, rep in _folding_table.iteritems():
yield (ord(c.upper()), rep.title())
yield (ord(c), rep)
folding_table = dict(_folditems())
def tofolded(ustr):
u"""Fold @ustr
Return a unicode str where composed characters are replaced by
their base, and extended latin characters are replaced by
similar basic latin characters.
>>> tofolded(u"Wyłącz")
u'Wylacz'
>>> tofolded(u"naïveté")
u'naivete'
Characters from other scripts are not transliterated.
>>> tofolded(u"Ἑλλάς") == u'Ελλας'
True
(These doctests pass, but should they fail, they fail hard)
"""
srcstr = normalize("NFKD", ustr.translate(folding_table))
return u"".join(c for c in srcstr if category(c) != 'Mn')
if __name__ == '__main__':
import doctest
doctest.testmod()
(और, वास्तविक मिलान के लिए करता है, तो है कि किसी को दिलचस्पी: मैं मुड़ा का निर्माण मेरे सभी सूची के लिए तार पहले से है, और पहले से ही उपलब्ध सूची वस्तु उर्फ संपत्ति में मुड़ा हुआ संस्करणों डाल)
यह वास्तव में अच्छा है, और शायद ऑटो-पूर्ण व्यक्ति नामों के लिए बेहद उपयोगी होगा, क्योंकि ज्यादातर लोग नामों की खोज करते समय उच्चारण शुरू करने के लिए परेशान नहीं होंगे। मैं जावा में कुछ ऐसा करने के तरीके पर शोध कर रहा हूं। ऐसा लगता है कि कुछ मामलों को संभाला जा सकता है: http://java.sun.com/javase/6/docs/api/java/text/Collator.html। –
हाँ। ध्यान दें कि आप उपरोक्त विशेष-केस तालिका से 'ü, å, ä, ö' छोड़ना चाहेंगे, यदि आप चाहते हैं कि वे केवल उच्चारण-पट्टी हो जाएं। उन डीफटोंग विस्तार जो मैं अपने पीओवी से चाहता था (मेरी भाषा को और अधिक सही ढंग से खराब कर रहा था); ऐसी सभी चीजों के लिए अन्य भाषाओं में दुर्भाग्यपूर्ण अपवाद हैं (उदाहरण के लिए स्पेनिश ü)। – u0b34a0f6ae