2017-10-30 16 views
8

मैं एक पाठ में विभिन्न अक्षरों की आवृत्ति खोजना चाहता हूं, और उनमें से कुछ डायक्रिटिक्स का उपयोग करते हैं। उदाहरण के लिए पाठ 'å' और 'ą̊' (U + 00E5 U + 0328) दोनों का उपयोग करता है और आवृत्ति को अलग से गिना जाना आवश्यक है।टेक्स्ट में डाइक्रिटिक्स के साथ सही अक्षरों को कैसे गिनना है?

मैं यह कैसे कर सकता हूं?

मैं काउंटर संग्रह का उपयोग कर की कोशिश की है, UTF8 प्रारूप का उपयोग कर फ़ाइल को खोलने, text.split() और list(text) दोनों का उपयोग कर पाठ स्ट्रिंग अलग हो गए, लेकिन अजगर अब भी वही पत्र के रूप में 'ए' और 'ए' मायने रखता है!

उत्तर

7

समस्या यह है कि यूनिकोड टेक्स्ट (यूटीएफ -8 के बारे में भूल जाओ, मैं आपके डेटा को उचित पायथन 3 तारों में डीकोड करने के बाद बात कर रहा हूं) कुछ पात्रों के लिए एक से अधिक यूनिकोड कोड बिंदु का उपयोग करता है: उदाहरण के लिए 'ą̊' दो अंक हैं , इसलिए उचित सामान्यीकरण के बाद दोनों "ą" और "å" एक वर्ण के रूप में मौजूद हो सकते हैं, एक वर्ण जो दोनों अंकों को लेता है, को यूनिकोड में "संयोजन चिह्न" वर्णों में से एक का उपयोग करना होता है।

इसका मतलब है कि पाइथन Counter अकेले कम से कम एक अतिरिक्त चरण के बिना इसे संभालने में सक्षम नहीं होगा। पायथन कोड में, इन मार्कर वर्णों के बारे में पता लगाने का तरीका unicodedata.category का उपयोग करके है - और यह अनुकूल नहीं है, यह सिर्फ two-character identifier for the category.

इसलिए, मुझे लगता है कि एक चीज जो किया जा सकता है वह आपके टेक्स्ट को पूर्व-प्रक्रिया करता है एक सूची जहां कुछ "शुद्ध पायथन" कोड का उपयोग करते हुए प्रत्येक चरित्र और उसके चिह्न सामान्यीकृत होते हैं। फिर, काउंटर अपना काम कर सकता था।

यह साथ कुछ हो सकता है:

import unicodedata 
from collections import Counter 

characters = [] 

text = ... 

# Decompose all characters into plain letters + marking diacritics: 
text = unicodedata.normalize("NFD", text) 
for character in text: 
    if unicodedata.category(character)[0] == "M": 
     # character is a composing mark, so agregate it with 
     # previous character 
     characters[-1] += character 
    else: 
     characters.append(character) 

counting = Counter(characters) 

+0

"चरित्र" लाइन है कि पढ़ता 'पर उद्धरण में नहीं होना चाहिए अगर unicodedata.category (" चरित्र ") [0] ==" एम ":' के रूप में यह एक चर को दर्शाता है। – olooney

+0

स्पॉटिंग के लिए धन्यवाद। – jsbueno

+1

इसके लिए बहुत बहुत धन्यवाद! मैंने परीक्षण किया और यह डबल मार्कर वाले अक्षरों के लिए भी अच्छा काम करता है :) मुझे 'unicodedata.normalize' और' unicodedata.category' 'की जांच करनी थी, इसलिए अगर अन्य लोगों को उनकी आवश्यकता हो तो लिंक यहां दिए गए हैं; https://docs.python.org/2/library/unicodedata.html#unicodedata.normalize https://docs.python.org/2/library/unicodedata.html#unicodedata.category http: // www .fileformat.info/जानकारी/यूनिकोड/श्रेणी/index.htm धन्यवाद मदद के लिए बहुत कुछ! – user11448

0

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

text.replace('ą̊', 'Ʒ').replace('Ą̊', 'ʒ') 
संबंधित मुद्दे