अजगर 3 में लिखे गए अंग्रेजी शब्दों की आवृत्ति विश्लेषक, वर्डनेट का उपयोग करके शब्दों को सामान्य करने में सक्षम है और स्टारडिक का उपयोग करके अनुवाद करता है

सभी को नमस्कार!
मैं अंग्रेजी का अध्ययन करता हूं और इस प्रक्रिया को हर तरह से सरल बनाता हूं। किसी तरह मुझे एक विशिष्ट पाठ के लिए अनुवाद और प्रतिलेखन के साथ शब्दों की एक सूची प्राप्त करने की आवश्यकता थी। कार्य मुश्किल नहीं था, और मैंने काम करना तय किया। थोड़ी देर बाद, एक अजगर स्क्रिप्ट लिखी गई, जो यह सब जानता है, और यह भी जानता है कि कैसे थोड़ा और अधिक, क्योंकि मैं अंदर अंग्रेजी पाठ के साथ सभी फाइलों से एक आवृत्ति शब्दकोश प्राप्त करना चाहता था। इसलिए स्क्रिप्ट का एक छोटा सा सेट सामने आया, जिसके बारे में मैं बात करना चाहूंगा।
स्क्रिप्ट फ़ाइलों को पार्स करने, अंग्रेजी शब्दों का चयन करने, उन्हें सामान्य करने, गिनने और अंग्रेजी शब्दों की पूरी परिणामी सूची से पहले काउंटवर्ड शब्द जारी करने से स्क्रिप्ट काम करती है।
अंतिम फ़ाइल में, शब्द इस प्रकार लिखा गया है:
[पुनरावृत्ति की संख्या] [शब्द ही] [शब्द अनुवाद]

आगे क्या होगा:
  1. हम एक फ़ाइल से अंग्रेजी शब्दों की सूची प्राप्त करके शुरू करेंगे ( नियमित अभिव्यक्ति का उपयोग करके);
  2. इसके बाद, हम शब्दों को सामान्य करना शुरू करेंगे, अर्थात्, उन्हें उनके प्राकृतिक रूप से उस रूप में लाएँ जिसमें वे शब्दकोशों में संग्रहीत हैं (यहाँ हम WordNet प्रारूप का थोड़ा अध्ययन करेंगे);
  3. फिर हम सभी सामान्यीकृत शब्दों की घटनाओं की संख्या की गणना करते हैं (यह त्वरित और आसान है);
  4. इसके अलावा, हम StarDict प्रारूप में बदलेंगे , क्योंकि इसकी मदद से हमें अनुवाद और प्रतिलेखन मिलता है।
  5. ठीक है, बहुत अंत में, हम परिणाम कहीं लिखेंगे (मैंने एक एक्सेल फ़ाइल का चयन किया है)।


मैंने अजगर 3.3 का उपयोग किया और मुझे एक बार से अधिक पछतावा करना चाहिए कि मैंने अजगर 2.7 में नहीं लिखा, क्योंकि अक्सर आवश्यक मॉड्यूल गायब थे।

आवृत्ति विश्लेषक।


तो, चलो एक साधारण से शुरू करते हैं, फाइलें प्राप्त करते हैं, उन्हें शब्दों में पार्स करते हैं, गिनती करते हैं, सॉर्ट करते हैं, और परिणाम उत्पन्न करते हैं।
आरंभ करने के लिए, हम पाठ में अंग्रेज़ी शब्दों को खोजने के लिए एक नियमित अभिव्यक्ति की रचना करेंगे।

अंग्रेजी शब्दों की खोज के लिए नियमित अभिव्यक्ति

एक साधारण अंग्रेजी शब्द, जैसे कि "ओवर", अभिव्यक्ति का उपयोग करके पाया जा सकता है "([ए-जेडए-जेड] +)" - अंग्रेजी वर्णमाला के एक या अधिक अक्षर यहां खोजे गए हैं।
एक यौगिक शब्द, उदाहरण के लिए "कमांडर-इन-चीफ", खोजने में कुछ अधिक कठिन है, हमें "प्रमुख" शब्द के बाद "कमांडर-", "इन" फॉर्म के लगातार उप-संदर्भों को देखने की जरूरत है। नियमित अभिव्यक्ति "" ((a-zA-Z] + -?) * [A-zA-Z] +) का रूप ले लेगी।
यदि कोई मध्यवर्ती उपसर्ग अभिव्यक्ति में मौजूद है, तो यह परिणाम में भी शामिल है। इसलिए, न केवल "कमांडर-इन-चीफ" शब्द हमारे परिणाम में आता है, बल्कि सभी पाए गए सबएक्सप्रेस भी हैं। उन्हें बाहर करने के लिए, हम सबप्रेप्रेशन की शुरुआत में जोड़ते हैं ?: 'शुरुआती कोष्ठक के बाद एक स्फटिक। फिर नियमित अभिव्यक्ति "(?:? [A-zA-Z] + -?) * [A-zA-Z] +) का रूप ले लेगी। " हमें अभी भी "नहीं" फ़ॉर्म के एपोस्ट्रोफ के साथ अभिव्यक्ति शब्दों में शामिल करना है। ऐसा करने के लिए, "-"? "[- ']?"
यह, हम नियमित अभिव्यक्ति में सुधारों को पूरा करेंगे, इसे और बेहतर बनाया जा सकता है, लेकिन इस पर ध्यान दें:
"((?: [a-zA-Z] + [- ']?) * [a-zA-ZA-Z +"

अंग्रेजी शब्दों के आवृत्ति विश्लेषक का कार्यान्वयन


हम एक छोटा वर्ग लिखेंगे जो अंग्रेजी शब्दों को निकाल सकते हैं, उन्हें गिन सकते हैं और परिणाम उत्पन्न कर सकते हैं।
# -*- coding: utf-8 -*- import re import os from collections import Counter class FrequencyDict: def __init__(): #        self.wordPattern = re.compile("((?:[a-zA-Z]+[-']?)*[a-zA-Z]+)") #  (  collections.Counter       ) self.frequencyDict = Counter() #   ,     def ParseBook(self, file): if file.endswith(".txt"): self.__ParseTxtFile(file, self.__FindWordsFromContent) else: print('Warning: The file format is not supported: "%s"' %file) #      txt def __ParseTxtFile(self, txtFile, contentHandler): try: with open(txtFile, 'rU') as file: for line in file: #    contentHandler(line) #       except Exception as e: print('Error parsing "%s"' % txtFile, e) #               def __FindWordsFromContent(self, content): result = self.wordPattern.findall(content) #       for word in result: word = word.lower() #      self.frequencyDict[word] += 1 #         #    countWord   ,      def FindMostCommonElements(self, countWord): dict = list(self.frequencyDict.items()) dict.sort(key=lambda t: t[0]) dict.sort(key=lambda t: t[1], reverse = True) return dict[0 : int(countWord)] 



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

अंग्रेजी लेम्मेटाइज़र


दो एल्गोरिदम हैं - स्टेमिंग और लेमेटेटाइजेशन । स्टेमिंग का तात्पर्य हेयुरिस्टिक विश्लेषण से है; यह किसी भी आधार का उपयोग नहीं करता है लेमेटेटाइजेशन के दौरान, विभिन्न शब्द आधारों का उपयोग किया जाता है, और व्याकरणिक नियमों के अनुसार परिवर्तन भी लागू होते हैं। हम अपने उद्देश्यों के लिए लेमेटेटाइजेशन का उपयोग करेंगे, क्योंकि परिणाम की त्रुटि स्टैमिंग की तुलना में बहुत कम है।

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



जैसा कि आप आरेख से देख सकते हैं, भाषण के केवल 4 भाग सामान्यीकृत होते हैं (संज्ञा, क्रिया, विशेषण और क्रिया विशेषण)।
यदि हम सामान्यीकरण प्रक्रिया का संक्षेप में वर्णन करते हैं, तो इसमें निम्नलिखित शामिल हैं:
1. भाषण के प्रत्येक भाग के लिए, 2 फाइलें वर्डनेट से डाउनलोड की जाती हैं - एक इंडेक्स डिक्शनरी (जिसमें इंडेक्स डिक्शनरी होती है और भाषण के हिस्से के अनुसार एक एक्सटेंशन होता है, उदाहरण के लिए adverbs.adv के लिए) और एक अपवाद फाइल होती है (भाषण के हिस्से के अनुसार एक्सटेंशन एक्स और एक नाम होता है, उदाहरण के लिए adv.exc क्रिया विशेषण)।
2. सामान्यीकरण के दौरान, अपवादों की सरणी को पहले चेक किया जाता है, यदि शब्द है, तो इसका सामान्यीकृत रूप वापस आ गया है। यदि शब्द अपवाद नहीं है, तो शब्द का भूत व्याकरण के नियमों के अनुसार शुरू होता है, अर्थात् समाप्त होता है, एक नया अंत होता है, चिपकाया जाता है, फिर शब्द को इंडेक्स सरणी में खोजा जाता है, और यदि यह है, तो शब्द को सामान्यीकृत माना जाता है। अन्यथा, निम्नलिखित नियम लागू होते हैं, और इसी तरह, जब तक कि नियम समाप्त नहीं होते हैं या शब्द पहले सामान्यीकृत नहीं होता है।
Lemmalizer के लिए कक्षाएं:
भाषण के हिस्सों के लिए बेस क्लास BaseWordNetItem.py
 # -*- coding: utf-8 -*- import os class BaseWordNetItem: #  def __init__(self, pathWordNetDict, excFile, indexFile): self.rule=() #        . self.wordNetExcDict={} #   self.wordNetIndexDict=[] #   self.excFile = os.path.join(pathWordNetDict, excFile) #      self.indexFile = os.path.join(pathWordNetDict, indexFile) #      self.__ParseFile(self.excFile, self.__AppendExcDict) #    self.__ParseFile(self.indexFile, self.__AppendIndexDict) #    self.cacheWords={} #  .     ,  -  ,  -   #       . #     : [-][][] def __AppendExcDict(self, line): #     ,     2      (  - ,  - ).         group = [item.strip() for item in line.replace("\n","").split(" ")] self.wordNetExcDict[group[0]] = group[1] #       . def __AppendIndexDict(self, line): #        group = [item.strip() for item in line.split(" ")] self.wordNetIndexDict.append(group[0]) #     ,          ,    def __ParseFile(self, file, contentHandler): try: with open(file, 'r') as openFile: for line in openFile: contentHandler(line) #       except Exception as e: raise Exception('File does not load: "%s"' %file) #      .      ,   . #        def _GetDictValue(self, dict, key): try: return dict[key] except KeyError: return None #     ,    True,  False. #  ,  ,   ,   (       ). def _IsDefined(self, word): if word in self.wordNetIndexDict: return True return False #   (  ) def GetLemma(self, word): word = word.strip().lower() #     if word == None: return None #   ,           lemma = self._GetDictValue(self.cacheWords, word) if lemma != None: return lemma # ,      ,    if self._IsDefined(word): return word #   ,    ,     lemma = self._GetDictValue(self.wordNetExcDict, word) if lemma != None: return lemma #    ,         ,      . lemma = self._RuleNormalization(word) if lemma != None: self.cacheWords[word] = lemma #       return lemma return None #     (  ,     ) def _RuleNormalization(self, word): #    ,         ,  ,   . for replGroup in self.rule: endWord = replGroup[0] if word.endswith(endWord): lemma = word #     lemma = lemma.rstrip(endWord) #    lemma += replGroup[1] #    if self._IsDefined(lemma): # ,        ,    ,    return lemma return None 


क्रियाओं को सामान्य करने के लिए वर्ग WordNetVerb.py
 # -*- coding: utf-8 -*- from WordNet.BaseWordNetItem import BaseWordNetItem #     #    BaseWordNetItem class WordNetVerb(BaseWordNetItem): def __init__(self, pathToWordNetDict): #   (BaseWordNetItem) BaseWordNetItem.__init__(self, pathToWordNetDict, 'verb.exc', 'index.verb') #        .  ,  "s"   "" , "ies"   "y" . self.rule = ( ["s" , "" ], ["ies" , "y" ], ["es" , "e" ], ["es" , "" ], ["ed" , "e" ], ["ed" , "" ], ["ing" , "e" ], ["ing" , "" ] ) #      GetLemma(word)     BaseWordNetItem 


संज्ञा के सामान्यीकरण के लिए वर्ग WordNetNoun.py
 # -*- coding: utf-8 -*- from WordNet.BaseWordNetItem import BaseWordNetItem #       #    BaseWordNetItem class WordNetNoun(BaseWordNetItem): def __init__(self, pathToWordNetDict): #   (BaseWordNetItem) BaseWordNetItem.__init__(self, pathToWordNetDict, 'noun.exc', 'index.noun') #        .  ,  "s"   "", "ses"   "s"  . self.rule = ( ["s" , "" ], ["'s" , "" ], ["'" , "" ], ["ses" , "s" ], ["xes" , "x" ], ["zes" , "z" ], ["ches" , "ch" ], ["shes" , "sh" ], ["men" , "man" ], ["ies" , "y" ] ) #    (  ) #       BaseWordNetItem,          , #      def GetLemma(self, word): word = word.strip().lower() #    ,         if len(word) <= 2: return None #     "ss",         if word.endswith("ss"): return None #   ,           lemma = self._GetDictValue(self.cacheWords, word) if lemma != None: return lemma # ,      ,    if self._IsDefined(word): return word #   ,    ,     lemma = self._GetDictValue(self.wordNetExcDict, word) if (lemma != None): return lemma #     "ful",   "ful",   ,     . #  ,  ,   "spoonsful"    "spoonful" suff = "" if word.endswith("ful"): word = word[:-3] #   "ful" suff = "ful" #   "ful",     #    ,         ,      . lemma = self._RuleNormalization(word) if (lemma != None): lemma += suff #     "ful",    self.cacheWords[word] = lemma #       return lemma return None 


Adverbs को सामान्य बनाने के लिए वर्ग WordNetAdverb.py
 # -*- coding: utf-8 -*- from WordNet.BaseWordNetItem import BaseWordNetItem #     #    BaseWordNetItem class WordNetAdverb(BaseWordNetItem): def __init__(self, pathToWordNetDict): #   (BaseWordNetItem) BaseWordNetItem.__init__(self, pathToWordNetDict, 'adv.exc', 'index.adv') #      (adv.exc)    (index.adv). #           . 


विशेषणों को सामान्य करने के लिए वर्ग WordNetAdjective.py
 # -*- coding: utf-8 -*- from WordNet.BaseWordNetItem import BaseWordNetItem #       #    BaseWordNetItem class WordNetAdjective(BaseWordNetItem): def __init__(self, pathToWordNetDict): #   (BaseWordNetItem) BaseWordNetItem.__init__(self, pathToWordNetDict, 'adj.exc', 'index.adj') #        .  ,  "er"   ""  "e"  . self.rule = ( ["er" , "" ], ["er" , "e"], ["est" , "" ], ["est" , "e"] ) #      GetLemma(word)     BaseWordNetItem 


Lemmatizer Lemmatizer.py के लिए क्लास
 # -*- coding: utf-8 -*- from WordNet.WordNetAdjective import WordNetAdjective from WordNet.WordNetAdverb import WordNetAdverb from WordNet.WordNetNoun import WordNetNoun from WordNet.WordNetVerb import WordNetVerb class Lemmatizer: def __init__(self, pathToWordNetDict): #    self.splitter = "-" #      adj = WordNetAdjective(pathToWordNetDict) #  noun = WordNetNoun(pathToWordNetDict) #  adverb = WordNetAdverb(pathToWordNetDict) #  verb = WordNetVerb(pathToWordNetDict) #  self.wordNet = [verb, noun, adj, adverb] #     (, ) def GetLemma(self, word): #     ,    ,   ( )  ,    wordArr = word.split(self.splitter) resultWord = [] for word in wordArr: lemma = self.__GetLemmaWord(word) if (lemma != None): resultWord.append(lemma) if (resultWord != None): return self.splitter.join(resultWord) return None #   (  ) def __GetLemmaWord(self, word): for item in self.wordNet: lemma = item.GetLemma(word) if (lemma != None): return lemma return None 



खैर, सामान्यीकरण के साथ समाप्त हो गया। अब आवृत्ति विश्लेषक शब्दों को सामान्य कर सकते हैं। हम अपने कार्य के अंतिम भाग की ओर मुड़ते हैं - अंग्रेजी शब्दों के लिए अनुवाद और क्षणिकाएँ प्राप्त करना।

विदेशी अनुवादक StarDict शब्दकोशों का उपयोग करना


आप StarDict के बारे में लंबे समय तक लिख सकते हैं, लेकिन इस प्रारूप का मुख्य लाभ यह है कि इसके लिए बहुत सारे शब्दकोश डेटाबेस हैं, लगभग सभी भाषाओं में। स्टारडक्ट विषय पर कोई लेख नहीं था और यह अंतराल भरने का समय है। StarDict प्रारूप का वर्णन करने वाली एक फ़ाइल आमतौर पर स्रोत के बगल में स्थित होती है।
यदि हम सभी परिवर्धन को छोड़ देते हैं, तो इस प्रारूप में ज्ञान का सबसे न्यूनतम सेट निम्नानुसार होगा:
प्रत्येक शब्दकोश में 3 आवश्यक फाइलें होनी चाहिए:

1. ifo एक्सटेंशन वाली फाइल - इसमें शब्दकोश का सुसंगत वर्णन है;
2. आईडी एक्सटेंशन के साथ फाइल। Idx फ़ाइल के अंदर प्रत्येक प्रविष्टि में 3 फ़ील्ड होते हैं जो एक के बाद एक जाते हैं:

3. डिक्‍टेड एक्‍सटेंशन के साथ फाइल - इसमें अनुवाद खुद होते हैं, जो अनुवाद की ऑफसेट (आईडीएक्स फ़ाइल में ऑफसेट दर्ज होता है) को जानकर पहुंचा जा सकता है।

दो बार यह सोचने के बिना कि कक्षाओं को आखिरकार क्या करना चाहिए, मैंने प्रत्येक फ़ाइलों के लिए एक वर्ग बनाया, और एक सामान्य स्टारडक्ट क्लास जो उन्हें जोड़ती है।
परिणामी वर्ग आरेख:



StarDict के लिए कक्षाएं:
शब्दकोश प्रविष्टियों के लिए बेस क्लास BaseStarDictItem.py
 # -*- coding: utf-8 -*- import os class BaseStarDictItem: def __init__(self, pathToDict, exp): #     self.encoding = "utf-8" #      self.dictionaryFile = self.__PathToFileInDirByExp(pathToDict, exp) #    self.realFileSize = os.path.getsize(self.dictionaryFile) #     path      exp def __PathToFileInDirByExp(self, path, exp): if not os.path.exists(path): raise Exception('Path "%s" does not exists' % path) end = '.%s'%(exp) list = [f for f in os.listdir(path) if f.endswith(end)] if list: return os.path.join(path, list[0]) #    else: raise Exception('File does not exist: "*.%s"' % exp) 


कक्षा ifo.py
 # -*- coding: utf-8 -*- from StarDict.BaseStarDictItem import BaseStarDictItem from Frequency.IniParser import IniParser class Ifo(BaseStarDictItem): def __init__(self, pathToDict): #   (BaseStarDictItem) BaseStarDictItem.__init__(self, pathToDict, 'ifo') #     self.iniParser = IniParser(self.dictionaryFile) #   ifo   #        ,        self.bookName = self.__getParameterValue("bookname", None) #   [ ] self.wordCount = self.__getParameterValue("wordcount", None) #    ".idx"  [ ] self.synWordCount = self.__getParameterValue("synwordcount", "") #    ".syn"   [ ,    ".syn"] self.idxFileSize = self.__getParameterValue("idxfilesize", None) #  ( ) ".idx" .    ,        [ ] self.idxOffsetBits = self.__getParameterValue("idxoffsetbits", 32) #    (32  64),         .dict.      3.0.0,      32 [ ] self.author = self.__getParameterValue("author", "") #   [ ] self.email = self.__getParameterValue("email", "") #  [ ] self.description = self.__getParameterValue("description", "") #   [ ] self.date = self.__getParameterValue("date", "") #    [ ] self.sameTypeSequence = self.__getParameterValue("sametypesequence", None) # ,    [ ] self.dictType = self.__getParameterValue("dicttype", "") #     ,  WordNet[ ] def __getParameterValue(self, key, defaultValue): try: return self.iniParser.GetValue(key) except: if defaultValue != None: return defaultValue raise Exception('\n"%s" has invalid format (missing parameter: "%s")' % (self.dictionaryFile, key)) 


कक्षा idx.py
 # -*- coding: utf-8 -*- from struct import unpack from StarDict.BaseStarDictItem import BaseStarDictItem class Idx(BaseStarDictItem): #  def __init__(self, pathToDict, wordCount, idxFileSize, idxOffsetBits): #   (BaseStarDictItem) BaseStarDictItem.__init__(self, pathToDict, 'idx') self.idxDict ={} # , self.idxDict = {'.': [_____dict, _____dict], ...} self.idxFileSize = int(idxFileSize) #   .idx,   .ifo  self.idxOffsetBytes = int(idxOffsetBits/8) #  ,         .dict.        self.wordCount = int(wordCount) #    ".idx"  #    (  .ifo    .idx  [idxfilesize]      ) self.__CheckRealFileSize() #   self.idxDict    .idx self.__FillIdxDict() #    (  .ifo     [wordcount]        .idx ) self.__CheckRealWordCount() #    ,   .ifo ,           def __CheckRealFileSize(self): if self.realFileSize != self.idxFileSize: raise Exception('size of the "%s" is incorrect' %self.dictionaryFile) #    ,   .ifo ,       .idx       def __CheckRealWordCount(self): realWordCount = len(self.idxDict) if realWordCount != self.wordCount: raise Exception('word count of the "%s" is incorrect' %self.dictionaryFile) #         ,      def __getIntFromByteArray(self, sizeInt, stream): byteArray = stream.read(sizeInt) #   ,    #       formatCharacter = 'L' #   "unsigned long" ( sizeInt = 4) if sizeInt == 8: formatCharacter = 'Q' #   "unsigned long long" ( sizeInt = 8) format = '>' + formatCharacter #     : "  " + " " #  '>' - ,       int( formatCharacter)     . integer = (unpack(format, byteArray))[0] #       return int(integer) #    .idx    (   3- )       self.idxDict def __FillIdxDict(self): languageWord = "" with open(self.dictionaryFile, 'rb') as stream: while True: byte = stream.read(1) #    if not byte: break #    ,     if byte != b'\0': #        '\0',      languageWord += byte.decode("utf-8") else: #    '\0',  ,         ("     dict"  "     dict") wordDataOffset = self.__getIntFromByteArray(self.idxOffsetBytes, stream) #    "     dict" wordDataSize = self.__getIntFromByteArray(4, stream) #    "     dict" self.idxDict[languageWord] = [wordDataOffset, wordDataSize] #    self.idxDict :   +  +   languageWord = "" #  ,     #       .dict ("     dict"  "     dict"). #      ,   None def GetLocationWord(self, word): try: return self.idxDict[word] except KeyError: return [None, None] 


क्लास डिक्टम
 # -*- coding: utf-8 -*- from StarDict.BaseStarDictItem import BaseStarDictItem #     ( , sametypesequence = tm). #  -x    (       utf-8,  '\0'): # 'm' -     utf-8,  '\0' # 'l' -       utf-8,  '\0' # 'g' -        Pango # 't' -    utf-8,  '\0' # 'x' -    utf-8,    xdxf # 'y' -    utf-8,  (YinBiao)   (KANA)  # 'k' -    utf-8,    KingSoft PowerWord XML # 'w' -     MediaWiki # 'h' -     Html # 'n' -     WordNet # 'r' -    .      (jpg),  (wav),  (avi), (bin)   . # 'W' - wav  # 'P' -  # 'X' -       class Dict(BaseStarDictItem): def __init__(self, pathToDict, sameTypeSequence): #   (BaseStarDictItem) BaseStarDictItem.__init__(self, pathToDict, 'dict') # ,     self.sameTypeSequence = sameTypeSequence def GetTranslation(self, wordDataOffset, wordDataSize): try: #              .dict self.__CheckValidArguments(wordDataOffset, wordDataSize) #   .dict   with open(self.dictionaryFile, 'rb') as file: #   file.seek(wordDataOffset) #      ,     byteArray = file.read(wordDataSize) #   ,     return byteArray.decode(self.encoding) #       o (self.encoding     BaseDictionaryItem) except Exception: return None def __CheckValidArguments(self, wordDataOffset, wordDataSize): if wordDataOffset is None: pass if wordDataOffset < 0: pass endDataSize = wordDataOffset + wordDataSize if wordDataOffset < 0 or wordDataSize < 0 or endDataSize > self.realFileSize: raise Exception 



, . , . main.py Settings.ini.
main.py
 # -*- coding: utf-8 -*- import os import xlwt3 as xlwt from Frequency.IniParser import IniParser from Frequency.FrequencyDict import FrequencyDict from StarDict.StarDict import StarDict ConfigFileName="Settings.ini" class Main: def __init__(self): self.listLanguageDict = [] #      StarDict self.result = [] #      ( , ,  ) try: #    - config = IniParser(ConfigFileName) self.pathToBooks = config.GetValue("PathToBooks") #   ini   PathToBooks,     (,   ),      self.pathResult = config.GetValue("PathToResult") #   ini   PathToResult,       self.countWord = config.GetValue("CountWord") #   ini   CountWord,       ,    self.pathToWordNetDict = config.GetValue("PathToWordNetDict") #   ini   PathToWordNetDict,      WordNet self.pathToStarDict = config.GetValue("PathToStarDict") #   ini   PathToStarDict,        StarDict #    StarDict           .      listPathToStarDict listPathToStarDict = [item.strip() for item in self.pathToStarDict.split(";")] #       StarDict     for path in listPathToStarDict: languageDict = StarDict(path) self.listLanguageDict.append(languageDict) #   ,      self.listBooks = self.__GetAllFiles(self.pathToBooks) #    self.frequencyDict = FrequencyDict(self.pathToWordNetDict) #  ,   StarDict  WordNet.    ,      ,     self.__Run() except Exception as e: print('Error: "%s"' %e) #    ,    path def __GetAllFiles(self, path): try: return [os.path.join(path, file) for file in os.listdir(path)] except Exception: raise Exception('Path "%s" does not exists' % path) #     ,      .        ,    def __GetTranslate(self, word): valueWord = "" for dict in self.listLanguageDict: valueWord = dict.Translate(word) if valueWord != "": return valueWord return valueWord #   ( , ,  )   countWord     Excel def __SaveResultToExcel(self): try: if not os.path.exists(self.pathResult): raise Exception('No such directory: "%s"' %self.pathResult) if self.result: description = 'Frequency Dictionary' style = xlwt.easyxf('font: name Times New Roman') wb = xlwt.Workbook() ws = wb.add_sheet(description + ' ' + self.countWord) nRow = 0 for item in self.result: ws.write(nRow, 0, item[0], style) ws.write(nRow, 1, item[1], style) ws.write(nRow, 2, item[2], style) nRow +=1 wb.save(os.path.join(self.pathResult, description +'.xls')) except Exception as e: print(e) #      def __Run(self): #       for book in self.listBooks: self.frequencyDict.ParseBook(book) #   countWord        mostCommonElements = self.frequencyDict.FindMostCommonElements(self.countWord) #      for item in mostCommonElements: word = item[0] counterWord = item[1] valueWord = self.__GetTranslate(word) self.result.append([counterWord, word, valueWord]) #      Excel self.__SaveResultToExcel() if __name__ == "__main__": main = Main() 


Settings.ini
 ;   (,   ),      PathToBooks = e:\Bienne\Frequency\Books ;    WordNet(    ) PathToWordNetDict = e:\Bienne\Frequency\WordNet\wn3.1.dict\ ;      StarDict(   ) PathToStarDict = e:\Bienne\Frequency\Dict\stardict-comn_dictd04_korolew ;     ,        Excel CountWord = 100 ; ,    (   Excel     -  , ,  ) PathToResult = e:\Bienne\Frequency\Books 



, , xlwt , Excel ( ).
Settings.ini PathToStarDict ";". — , , StarDict.

अंतभाषण


, , github .
:
  1. windows ;
  2. python 3.3 ;
  3. xlwt Excel;
  4. WordNet StarDict ( StarDict dict);
  5. Settings.ini .
  6. , StarDict, ( ).

Source: https://habr.com/ru/post/In161073/


All Articles