python - पाइथन यूनिकोड स्ट्रिंग में लहजे को हटाने का सबसे अच्छा तरीका क्या है?




python-3.x unicode (6)

मेरे पास पाइथन में यूनिकोड स्ट्रिंग है, और मैं सभी उच्चारण (diacritics) को हटाना चाहता हूं।

मैंने वेब पर जावा में ऐसा करने का एक शानदार तरीका पाया:

  1. यूनिकोड स्ट्रिंग को अपने लंबे सामान्यीकृत रूप में परिवर्तित करें (अक्षरों और diacritics के लिए एक अलग चरित्र के साथ)
  2. उन सभी पात्रों को हटा दें जिनके यूनिकोड प्रकार "diacritic" है।

क्या मुझे पुस्तकालय स्थापित करने की आवश्यकता है जैसे कि pyICU या क्या यह केवल पायथन मानक लाइब्रेरी के साथ संभव है? और अजगर 3 के बारे में क्या?

महत्वपूर्ण नोट: मैं संगत अक्षरों से उनके गैर-उच्चारण वाले समकक्ष तक स्पष्ट मैपिंग के साथ कोड से बचना चाहता हूं।


@ मिनीब के जवाब के जवाब में:

मैं एक सीएसवी फ़ाइल में पढ़ने की कोशिश कर रहा था जो आधा फ्रांसीसी (उच्चारण युक्त) था और कुछ तार भी जो अंततः पूर्णांक और फ्लोट बन जाएंगे। एक परीक्षण के रूप में, मैंने एक test.txt फ़ाइल बनाई जो इस तरह दिखाई दे रही थी:

मॉन्ट्रियल, उबर, 12.8 9, मेरे, फ्रैंकोइस, नोएल, 88 9

मुझे इसे काम करने के लिए लाइन 2 और 3 शामिल करना था (जो मुझे एक अजगर टिकट में मिला), साथ ही @ जब्बा की टिप्पणी भी शामिल है:

import sys 
reload(sys) 
sys.setdefaultencoding("utf-8")
import csv
import unicodedata

def remove_accents(input_str):
    nkfd_form = unicodedata.normalize('NFKD', unicode(input_str))
    return u"".join([c for c in nkfd_form if not unicodedata.combining(c)])

with open('test.txt') as f:
    read = csv.reader(f)
    for row in read:
        for element in row:
            print remove_accents(element)

परिणाम:

Montreal
uber
12.89
Mere
Francoise
noel
889

(नोट: मै मैक ओएस एक्स 10.8.4 पर और पायथन 2.7.3 का उपयोग कर रहा हूं)


असल में मैं प्रोजेक्ट संगत पायथन 2.6, 2.7 और 3.4 पर काम करता हूं और मुझे मुफ्त उपयोगकर्ता प्रविष्टियों से आईडी बनाना है।

धन्यवाद, मैंने यह फ़ंक्शन बनाया है जो अद्भुत काम करता है।

import re
import unicodedata

def strip_accents(text):
    """
    Strip accents from input String.

    :param text: The input string.
    :type text: String.

    :returns: The processed String.
    :rtype: String.
    """
    try:
        text = unicode(text, 'utf-8')
    except (TypeError, NameError): # unicode is a default on python 3 
        pass
    text = unicodedata.normalize('NFD', text)
    text = text.encode('ascii', 'ignore')
    text = text.decode("utf-8")
    return str(text)

def text_to_id(text):
    """
    Convert input text to id.

    :param text: The input string.
    :type text: String.

    :returns: The processed String.
    :rtype: String.
    """
    text = strip_accents(text.lower())
    text = re.sub('[ ]+', '_', text)
    text = re.sub('[^0-9a-zA-Z_-]', '', text)
    return text

परिणाम:

text_to_id("Montréal, über, 12.89, Mère, Françoise, noël, 889")
>>> 'montreal_uber_1289_mere_francoise_noel_889'

कुछ भाषाओं ने उच्चारण निर्दिष्ट करने के लिए भाषा अक्षरों और उच्चारण व्याख्यान के रूप में उच्चारनात्मक संयोजन किया है।

मुझे लगता है कि यह स्पष्ट रूप से निर्दिष्ट करना अधिक सुरक्षित है कि आप कौन सी डाइक्ट्रिक्स को पट्टी करना चाहते हैं:

def strip_accents(string, accents=('COMBINING ACUTE ACCENT', 'COMBINING GRAVE ACCENT', 'COMBINING TILDE')):
    accents = set(map(unicodedata.lookup, accents))
    chars = [c for c in unicodedata.normalize('NFD', string) if c not in accents]
    return unicodedata.normalize('NFC', ''.join(chars))

मुझे बस वेब पर यह जवाब मिला:

import unicodedata

def remove_accents(input_str):
    nfkd_form = unicodedata.normalize('NFKD', input_str)
    only_ascii = nfkd_form.encode('ASCII', 'ignore')
    return only_ascii

यह ठीक काम करता है (फ़्रेंच के लिए, उदाहरण के लिए), लेकिन मुझे लगता है कि दूसरे चरण (उच्चारण को हटाने) को गैर-ASCII वर्णों को छोड़ने से बेहतर तरीके से संभाला जा सकता है, क्योंकि यह कुछ भाषाओं (ग्रीक, उदाहरण के लिए) में विफल हो जाएगा। सबसे अच्छा समाधान शायद यूनिकोड वर्णों को स्पष्ट रूप से निकालना होगा जिन्हें डाइक्रिटिक्स के रूप में टैग किया गया है।

संपादित करें : यह चाल है:

import unicodedata

def remove_accents(input_str):
    nfkd_form = unicodedata.normalize('NFKD', input_str)
    return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])

unicodedata.combining(c) सही हो जाएगा यदि चरित्र c को पिछले चरित्र के साथ जोड़ा जा सकता है, जो मुख्य रूप से यह एक विशिष्ट है।

2 संपादित करें : remove_accents एक यूनिकोड स्ट्रिंग की अपेक्षा करता है, बाइट स्ट्रिंग नहीं। यदि आपके पास बाइट स्ट्रिंग है, तो आपको इसे एक यूनिकोड स्ट्रिंग में डीकोड करना होगा:

encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you use
byte_string = b"café"  # or simply "café" before python 3.
unicode_string = byte_string.decode(encoding)

Unidecode इसके लिए सही जवाब है। यह एसिसी पाठ में निकटतम संभावित प्रतिनिधित्व में किसी भी यूनिकोड स्ट्रिंग का अनुवाद करता है।

उदाहरण:

accented_string = u'Málaga'
# accented_string is of type 'unicode'
import unidecode
unaccented_string = unidecode.unidecode(accented_string)
# unaccented_string contains 'Malaga'and is of type 'str'

gensim.utils.deaccent(text) - मनुष्यों के लिए विषय मॉडलिंग :

deaccent("Šéf chomutovských komunistů dostal poštou bílý prášek") 'Sef chomutovskych komunistu dostal postou bily prasek'

एक और समाधान Unidecode

यह नहीं कि यूनिकोडेडाटा के साथ सुझाए गए समाधान आम तौर पर केवल कुछ वर्णों में उच्चारण को हटा देते हैं (उदाहरण के लिए यह 'ł' बजाय 'ł' में बदल जाता है)।





diacritics