~grosmoteur/grosmoteur/trunk

« back to all changes in this revision

Viewing changes to lib/ngram.py

  • Committer: kim
  • Date: 2014-02-22 17:13:52 UTC
  • Revision ID: kmgrds@gmail.com-20140222171352-iodi07d46m2boftw
2014

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
 
 
3
import os, sys, re, codecs, glob, unicodedata, re
 
4
from operator import itemgetter
 
5
from heapq import nlargest
 
6
 
 
7
verbose = False
 
8
#verbose = 1
 
9
 
 
10
langs = {
 
11
'af':'Afrikaans',
 
12
'als':'Alsatian',
 
13
'ar':'Arabic',
 
14
'az':'Azerbaijan',
 
15
'be':'Belorussian',
 
16
'bg':'Bulgarian',
 
17
'bi':'Bislama (currently also used by Bitruscan and Tok Pisin)',
 
18
'bn':'Bengali',
 
19
'br':'Breton',
 
20
'bs':'Bosnian',
 
21
'ca':'Catalan',
 
22
'cdo':'Cantonese (Roman script)',
 
23
'chr':'Cherokee',
 
24
'co':'Corsican',
 
25
'cs':'Czech',
 
26
'csb':'Kashubian',
 
27
'cy':'Welsh',
 
28
'da':'Danish',
 
29
'de':'German',
 
30
'dk':'Danish (wrong name)',
 
31
'dv':'Dhivehi',
 
32
'el':'Greek',
 
33
'en':'English',
 
34
'eo':'Esperanto',
 
35
'es':'Spanish',
 
36
'et':'Estonian',
 
37
'eu':'Basque',
 
38
'fa':'Persian',
 
39
'fi':'Finnish',
 
40
'fo':'Faroese',
 
41
'fr':'French',
 
42
'fy':'Frisian',
 
43
'ga':'Irish Gaelic',
 
44
'gd':'Scottish Gaelic',
 
45
'gl':'Galician',
 
46
'gn':'Guarani',
 
47
'gu':'Gujarati',
 
48
'gv':'Manx',
 
49
'he':'Hebrew',
 
50
'hi':'Hindi',
 
51
'hr':'Croatian',
 
52
'hu':'Hungarian',
 
53
'ia':'Interlingua',
 
54
'id':'Indonesian',
 
55
'io':'Ido',
 
56
'is':'Icelandic',
 
57
'it':'Italian',
 
58
'ja':'Japanese',
 
59
'jv':'Javanese',
 
60
'ka':'Georgian',
 
61
'km':'Khmer',
 
62
'ko':'Korean',
 
63
'ks':'Ekspreso, but should become Kashmiri',
 
64
'ku':'Kurdish',
 
65
'la':'Latin',
 
66
'lt':'Latvian',
 
67
'lv':'Livonian',
 
68
'mg':'Malagasy',
 
69
'mi':'Maori',
 
70
'minnan':'Min-Nan',
 
71
'mk':'Macedonian',
 
72
'ml':'Malayalam',
 
73
'mn':'Mongolian',
 
74
'mr':'Marathi',
 
75
'ms':'Malay',
 
76
'na':'Nauruan',
 
77
'nah':'Nahuatl',
 
78
'nb':'Norwegian (Bokmal)',
 
79
'nds':'Lower Saxon',
 
80
'nl':'Dutch',
 
81
'no':'Norwegian',
 
82
'nn':'Norwegian (Nynorsk)',
 
83
'oc':'Occitan',
 
84
'om':'Oromo',
 
85
'pl':'Polish',
 
86
'ps':'Pashto',
 
87
'pt':'Portuguese',
 
88
'ro':'Romanian',
 
89
'roa-rup':'Aromanian',
 
90
'ru':'Russian',
 
91
'sa':'Sanskrit',
 
92
'sh':'OBSOLETE, Serbocroatian',
 
93
'si':'Sinhalese',
 
94
'simple':'Simple English',
 
95
'sk':'Slovakian',
 
96
'sl':'Slovenian',
 
97
'sq':'Albanian',
 
98
'sr':'Serbian',
 
99
'st':'Sesotho',
 
100
'su':'Sundanese',
 
101
'sv':'Swedish',
 
102
'sw':'Swahili',
 
103
'ta':'Tamil',
 
104
'th':'Thai',
 
105
'tl':'Tagalog',
 
106
'tlh':'Klingon',
 
107
'tokipona':'Toki Pona',
 
108
'tpi':'Tok Pisin',
 
109
'tr':'Turkish',
 
110
'tt':'Tatar',
 
111
'uk':'Ukrainian',
 
112
'ur':'Urdu',
 
113
'uz':'Uzbek',
 
114
'vi':'Vietnamese',
 
115
'vo':'Volapuk',
 
116
'wa':'Walon',
 
117
'xh':'isiXhosa',
 
118
'yi':'Yiddish',
 
119
'yo':'Yoruba',
 
120
'wo':'Wolof',
 
121
'za':'Zhuang',
 
122
'zh':'Chinese',
 
123
'zh-cn':'Simplified Chinese',
 
124
'zh-tw':'Traditional Chinese'
 
125
}
 
126
 
 
127
rtlLanguages=['Arabic','Hebrew','Pashto','Persian','Urdu']
 
128
 
 
129
decPunctex=re.compile(ur"\d*\W*", re.U+re.I)
 
130
 
 
131
 
 
132
def mostcommon(iterable, n=None):
 
133
    """Return a sorted list of the most common to least common elements and
 
134
    their counts.  If n is specified, return only the n most common elements.
 
135
 
 
136
    """
 
137
    bag = {}
 
138
    bag_get = bag.get
 
139
    for elem in iterable:
 
140
        bag[elem] = bag_get(elem, 0) + 1
 
141
    if n is None:
 
142
        return sorted(bag.iteritems(), key=itemgetter(1), reverse=True)
 
143
    it = enumerate(bag.iteritems())
 
144
    nl = nlargest(n, ((cnt, i, elem) for (i, (elem, cnt)) in it))
 
145
    return [(elem, cnt) for cnt, i, elem in nl]
 
146
 
 
147
 
 
148
class Ngram:
 
149
 
 
150
        def __init__(self):
 
151
                self.n=3
 
152
                self.ngramnum = 500
 
153
                self.charnum = 200 # if too small, doesn't recognize chinese!
 
154
                
 
155
                self.freqmulti = 1000000
 
156
                
 
157
                self.langfolder = "./languages"
 
158
                self.langext = "lang.txt"
 
159
                self.ngramext = "ng"
 
160
                self.ngrams={}
 
161
                self.replare = re.compile(r"\s+")
 
162
                
 
163
                self.charGuesser =      [       
 
164
                ("Lo","CJK","zh"),
 
165
                ("Lo","HANGUL","ko"),
 
166
                ("Lo","HIRAGANA","ja"),
 
167
                ("Lo","KATAKANA","ja"),
 
168
                ("Ll","GREEK","el"),
 
169
                ("Lu","GREEK","el"),
 
170
                ("Lo","GUJARATI","gu"),
 
171
                ("Lo","GEORGIAN","ka"),
 
172
                ("Lo","BENGALI","bn"),
 
173
                ("Lo","TAMIL","ta"),
 
174
                ("Lo","THAI","th"),
 
175
                ("Lo","THAANA","dv"),   
 
176
                ("Lo","DEVANAGARI","ngram"),
 
177
                ("Ll","CYRILLIC","ngram"),
 
178
                ("Lu","CYRILLIC","ngram"),
 
179
                ("Lo","ARABIC","ngram"),
 
180
                ("Lo","ARABIC","ngram"),
 
181
                ("Ll","LATIN","ngram"),
 
182
                ("Lu","LATIN","ngram")
 
183
                ]
 
184
                
 
185
                
 
186
                self.readNgrams()
 
187
        
 
188
        def guessLanguage(self,text,  removeDecPunct=False):
 
189
                """
 
190
                takes a text,
 
191
                gives back the code of the most probable language by:
 
192
                - first looking at the unicode categories and keys of the self.charnum most common characters
 
193
                - if self.charGuesser gives a name, give back that name
 
194
                - if self.charGuesser gives 'ngram', try ngram approach
 
195
                """
 
196
                if removeDecPunct:
 
197
                        langCat, langK = self.mostCommonUnicodeKeys(decPunctex.sub(" ", text))  
 
198
                else:
 
199
                        langCat, langK = self.mostCommonUnicodeKeys(text)       
 
200
#               if verbose: print "langCat,langK", langCat,langK
 
201
                for cat,key,name in self.charGuesser:
 
202
                        if langCat == cat and langK == key:
 
203
                                if name == "ngram":
 
204
#                                       if verbose: print self.highestNgramMatches(text)
 
205
                                        res = self.highestNgramMatches(text)
 
206
                                        if res: return res[0]
 
207
                                else: return 100,name
 
208
                                        
 
209
                return 0, "unknown language! information: "+langCat+" "+ langK
 
210
                                
 
211
        def guessLanguageRealName(self,text):
 
212
                """
 
213
                wrapper class for guessLanguage
 
214
                gives back real name
 
215
                """
 
216
                
 
217
                return langs.get(self.guessLanguage(text)[1],"an unknown language, maybe "+str(self.mostCommonUnicodeKeys(text)))
 
218
        
 
219
        def distance(self,text,lang):
 
220
                textlen=len(text)
 
221
                if textlen==0:return
 
222
                text = self.replare.sub("_"," "+text+" ".lower())
 
223
                textNgrams={}
 
224
                distance=0
 
225
                # computing the value added for each ngram found
 
226
                addValue = int((1.0/textlen)*self.freqmulti)
 
227
                
 
228
                textNgrams = self.ngramList(text,self.n,addValue)[:self.ngramnum]
 
229
                
 
230
                for f,nuple in textNgrams:#.iteritems(): # for each ngram
 
231
#                       if verbose: print "___",nuple,f
 
232
                        distance= distance + abs(self.ngrams[lang].get(nuple,0)-f)
 
233
                distance = (float(distance)/addValue/textlen-1)*(-100)
 
234
                #langlist = [(,l) for l,dist in distdico.iteritems()]
 
235
                #langlist.sort()
 
236
                #langlist.reverse()
 
237
                return distance                 
 
238
                
 
239
                        
 
240
        def readNgrams(self):
 
241
                folder = os.path.join(self.langfolder,'*'+self.ngramext)
 
242
                for filename in glob.glob(os.path.normcase(folder)):
 
243
                        language = filename.split("/")[-1].split(".")[0]
 
244
                        self.ngrams[language]={}
 
245
                        file = codecs.open(filename,"r", "utf-8" )
 
246
                        for line in file:
 
247
                                try:
 
248
                                        g,f=line.split("\t")
 
249
                                        self.ngrams[language][g]=int(f)
 
250
                                except:
 
251
                                        print "error in file",filename
 
252
 
 
253
        def allLanguages(self):
 
254
                """
 
255
                gives a list of all languages we have information about
 
256
                """
 
257
                codes = []
 
258
                names = []
 
259
                for cat,key,name in self.charGuesser:
 
260
                        if name != "ngram":codes+=[name]
 
261
                        
 
262
                
 
263
                folder = os.path.join(self.langfolder,'*'+self.ngramext)
 
264
                for filename in glob.glob(os.path.normcase(folder)):
 
265
                        language = filename.split("/")[-1].split(".")[0]
 
266
                        codes+=[language]
 
267
                
 
268
                codes=list(set(codes))
 
269
                codes.sort()
 
270
                for c in codes:
 
271
                        names+= [langs.get(c,c)]
 
272
                return codes,names
 
273
 
 
274
        def makeNgrams(self):
 
275
                folder = os.path.join(self.langfolder,'*'+self.langext)
 
276
                if verbose: print "making",str(self.n)+"-grams..."
 
277
                number=0
 
278
                for infilename in glob.glob(os.path.normcase(folder)): # for each minicorpus of a language
 
279
                        language = infilename.split("/")[-1].split(".")[0]
 
280
                        
 
281
                        if verbose: print language,
 
282
                        infile = codecs.open(infilename,"r", "utf-8" )
 
283
                        outfile = codecs.open(os.path.join(self.langfolder,language+"."+self.ngramext) ,"w", "utf-8" )
 
284
                        text = infile.read()
 
285
                        textlen=len(text)
 
286
                        text = self.replare.sub("_"," "+text+" ".lower())
 
287
                        
 
288
                        if textlen==0:continue
 
289
                        #invlen = 1.0/textlen
 
290
                        addValue = int((1.0/textlen)*self.freqmulti)
 
291
                        #print text
 
292
                        
 
293
                        sordico = self.ngramList(text,self.n,addValue)[:self.ngramnum]
 
294
                        
 
295
                        #sordico = sordico
 
296
                        #self.ngrams[language]=sordico
 
297
                        #print len(text)
 
298
                        for f,g in sordico:
 
299
                                outfile.write(g+"\t"+str(f)+"\n")
 
300
                        number+=1
 
301
                        
 
302
                print "  done",number,"languages"
 
303
        
 
304
        def ngramList(self,text,n,addValue):
 
305
                """
 
306
                for a text, the size of the ngram and the value to add for each ngram found,
 
307
                the function gives back
 
308
                a list of couples 
 
309
                """
 
310
                thesengrams={}
 
311
                for i in range(len(text)-n):
 
312
                        nuple = text[i:i+n]
 
313
                        thesengrams[nuple]=thesengrams.get(nuple,0)+addValue
 
314
                sordico = [(f,g) for g,f in thesengrams.iteritems()]
 
315
                sordico.sort()
 
316
                sordico.reverse()
 
317
                return sordico
 
318
                
 
319
        
 
320
        def mostCommonUnicodeKeys(self,text):
 
321
                """
 
322
                takes a text,
 
323
                gives back 
 
324
                - the most common unicodedata.category (of the self.charnum most common characters)
 
325
                - the most common first word in the unicodedata.name (of the self.charnum most common characters)
 
326
                
 
327
                category values:
 
328
                * Lu - uppercase letters
 
329
                * Ll - lowercase letters
 
330
                * Lt - titlecase letters
 
331
                * Lm - modifier letters
 
332
                * Lo - other letters
 
333
                * Nl - letter numbers
 
334
                * Mn - nonspacing marks
 
335
                * Mc - spacing combining marks
 
336
                * Nd - decimal numbers
 
337
                * Pc - connector punctuations   
 
338
                """
 
339
                textlen=len(text)
 
340
                if textlen<2:return "",""
 
341
                text = self.replare.sub(" ",text) 
 
342
                #frequentLetters=[]
 
343
#               frequentChars=[]
 
344
                
 
345
#               for f,c in self.ngramList(text,1,1.0/textlen):
 
346
#                       cat = unicodedata.category(c)
 
347
#                       if cat[0]=="L":
 
348
#                               frequentLetters+=[(f,c)]
 
349
#                       frequentChars += [(f,c)]
 
350
                frequentChars = [(f,c) for f,c in self.ngramList(text,1,1.0/textlen)][:self.charnum]
 
351
#               print "frequentChars", frequentChars
 
352
                #frequentLetters=frequentLetters[:self.charnum]
 
353
                
 
354
                langCats=[]
 
355
                langKeys=[]
 
356
                for f,c in frequentChars:
 
357
#                       print "*",f,c,"*****"
 
358
                        langCats+=[unicodedata.category(c)]
 
359
                        langKeys+=[unicodedata.name(c).split()[0]]
 
360
                
 
361
                
 
362
                #for a,b in frequentLetters : print a,b,unicodedata.category(b),unicodedata.name(b)
 
363
                langCat = mostcommon(langCats,1)[0][0]
 
364
                langK = mostcommon(langKeys,1)[0][0]
 
365
                return langCat,langK
 
366
                
 
367
                                                
 
368
        def highestNgramMatches(self, text):
 
369
                """ 
 
370
                takes a text, 
 
371
                gives back a list of all (score,language_code), starting with the highest score
 
372
                """
 
373
                
 
374
                textlen=len(text)
 
375
                text = self.replare.sub("_"," "+text+" ".lower())
 
376
                textNgrams={}
 
377
                distdico={}
 
378
                
 
379
                if textlen==0:return
 
380
                # computing the value added for each ngram found
 
381
                addValue = int((1.0/textlen)*self.freqmulti)
 
382
                #if verbose: print "addValue",addValue
 
383
                #print 1/0
 
384
                #for i in range(len(text)-self.n+1):
 
385
                        #nuple = text[i:i+self.n]
 
386
                        ##print nuple,textNgrams.get(nuple,0)+addValue
 
387
                        #textNgrams[nuple]=textNgrams.get(nuple,0)+addValue
 
388
                
 
389
                textNgrams = self.ngramList(text,self.n,addValue)[:self.ngramnum]
 
390
                
 
391
                #sordico = sordico[:self.ngramnum]
 
392
                for f,nuple in textNgrams:#.iteritems(): # for each ngram
 
393
                        #if verbose: print "___",nuple,f
 
394
                        for l,ng in self.ngrams.iteritems(): # for each language
 
395
                                distdico[l]= distdico.get(l,0) + abs(ng.get(nuple,0)-f)
 
396
                                #if verbose: print nuple,l,"f:",f,"ng.get(nuple,0):",ng.get(nuple,0),abs(ng.get(nuple,0)-f)
 
397
                langlist = [((float(dist)/addValue/textlen-1)*(-100),l) for l,dist in distdico.iteritems()]
 
398
                langlist.sort()
 
399
                langlist.reverse()
 
400
                return langlist                 
 
401
 
 
402
        def extractGoodLanguageParags(self, text, goodLanguageCode):
 
403
                newtext=""
 
404
                for sentence in text.split("\n"):
 
405
                        if self.guessLanguage(sentence)[1]==goodLanguageCode:
 
406
                                newtext+=sentence+"\n"
 
407
                return newtext
 
408
 
 
409
 
 
410
        ################################################# end of class Ngram #############################"
 
411
 
 
412
 
 
413
if __name__ == "__main__":
 
414
        ngram = Ngram()
 
415
        ngram.makeNgrams()
 
416
        print "_________"
 
417
        
 
418
        testset= [
 
419
        ("ar","تاگلديت ن لمغرب"),
 
420
        ("fa","برای دیدن موارد مربوط به گذشته صفحهٔ بایگانی را ببینید."),
 
421
        ("ps","""، کړ و وړو او نورو راز راز پژني او رواني اکرو بکرو... څرګندويي کوي او د چاپېريال او مهال څيزونه، ښکارندې، پېښې،ښه او بد... رااخلي. په بله وينا: ژبه د پوهاوي راپوهاوي وسيله ده.د ژبې په مټ خپل اندونه،واندونه (خيالونه)، ولولې، هيلې او غوښتنې سيده يا ناسيده، عمودي يا افقي نورو ته لېږدولای شو. خبرې اترې يې سيده او ليکنه يې ناسيده ډول دی.که بيا يې هممهالو ته لېږدوو، افقي او که راتلونکو پښتونو( نسلونو) ته يې لېږدوو، عمودي بلل کېږي."),"""),
 
422
        ("en","the"),
 
423
        ("ja","ウィキペディアはオープンコンテントの百科事典です。基本方針に賛同していただけるなら、誰でも記事を編集したり新しく作成したりできます。詳しくはガイドブックをお読みください。"),
 
424
        ("el","Το κεντροδεξιό Εθνικό Κόμμα του Τζον Κέι κερδίζει τις εκλογές στη Νέα Ζηλανδία, αποκαθηλώνοντας από την εξουσία το Εργατικό Κόμμα της Έλεν Κλαρκ, έπειτα από εννέα χρόνια."),
 
425
        ("ru","Голубь предпочитает небольшие, чаще всего необитаемые острова, где отсутствуют хищники. Живёт в джунглях."),
 
426
        ("bg","За антихитлеристите месец август 1944 година се оказва добър. "),
 
427
        ("hi","पहले परमाणु को अविभाज्य माना जाता था।"),
 
428
        ("gl","Aínda que non nega que os asasinatos de civís armenios ocorreran na realidade, o goberno turco non admite que se tratase dun xenocidio, argumentando que as mortes non foron a resulta dun plano de exterminio masivo organizado polo estado otomán, senón que, en troques, foron causadas polas loitas étnicas, as enfermidades e a fame durante o confuso período da I Guerra Mundial. A pesares desta tese, case tódolos estudosos -até algúns turcos- opinan que os feitos encádranse na definición actual de xenocidio. "),
 
429
        ("de","Was nicht daran liegt, dass das Unternehmen kein Interesse an der Verarbeitung biologisch angebauter Litschis hat. Die Menge an Obst aber, die Bionade inzwischen braucht, gibt es auf dem weltweiten Biomarkt nicht - oder nur zu einem sehr hohen Preis. Im Prinzip gebe es zwar ausreichend Litschis, allerdings werde ein Großteil der Früchte für den Frischobstmarkt angebaut und auch dort gehandelt. Wandelte man dieses Frischobst in Konzentrat um, würde dies zu teuer, sagte ein Geschäftspartner von Bionade gegenüber Foodwatch. scheiße"),
 
430
        ("mr","भारतीय रेल्वे (संक्षेपः भा. रे.) ही भारताची सरकार-नियंत्रित सार्वजनिक रेल्वेसेवा आहे. भारतीय रेल्वे जगातील सर्वात मोठ्या रेल्वेसेवांपैकी एक आहे. भारतातील रेल्वेमार्गांची एकूण लांबी ६३,१४० कि.मी. "),
 
431
        ("fa","""
 
432
         ویکی‌پدیا یک پروژهٔ ناسودبر است: لطفاً امروز کمک کنید.
 
433
اکنون کمک کنید »
 
434
[نمایش]
 
435
حمایت از ویکی‌پدیا: یک پروژهٔ ناسودبر.
 
436
اکنون کمک کنید »
 
437
اتم
 
438
از ویکی‌پدیا، دانشنامهٔ آزاد
 
439
پرش به: ناوبری, جستجو
 
440
اتم
 
441
اتم هلیوم
 
442
This illustrates the nucleus (pink) and the electron cloud distribution (black) of the Helium atom. The nucleus (upper right) is in reality spherically symmetric, although this is not always the case for more complicated nuclei.
 
443
رده
 
444
کوچک‌ترین جز در شیمی عناصر
 
445
مشخصات
 
446
جرم :   ≈ 1.67×10-27
 
447
 
 
448
to 4.52×10-25
 
449
 
 
450
 kg
 
451
بار الکتریکی :  صفر
 
452
قطر : (قطر به عنصر و ایزتوپ اتم بستگی دارد)‎    31 pm (He) تا 520 pm (Cs)‎
 
453
انواع اتمهای که تاکنون دیده ‌شده‌است:   ~1080[۱]
 
454
 
 
455
اتم کوچکترین واحد تشکیل دهنده یک عنصر شیمیایی است که خواص منحصر به فرد آن عنصر را حفظ می‌کند. تعريف ديگری آن را به عنوان کوچکترين واحدی در نظر ميگيرد که ماده را ميتوان به آن تقسيم کرد بدون اينکه اجزاء بارداری از آن خارج شود.[۲] اتم ابری الکترونی، تشکیل‌شده از الکترون‌ها با بار الکتریکی منفی، که هستهٔ اتم را احاطه کرده‌است. هسته نیز خود از پروتون که دارای بار مثبت است و نوترون که از لحاظ الکتریکی خنثی است تشکیل شده است. زمانی که تعداد پروتون‌ها و الکترون‌های اتم با هم برابر هستند اتم از نظر الکتریکی در حالت خنثی یا متعادل قرار دارد در غیر این صورت آن را یون می‌نامند که می‌تواند دارای بار الکتریکی مثبت یا منفی باشد. اتم‌ها با توجه به تعداد پروتون‌ها و نوترون‌های آنها طبقه‌بندی می‌شوند. تعداد پروتون‌های اتم مشخص کننده نوع عنصر شیمیایی و تعداد نوترون‌ها مشخص‌کننده ایزوتوپ عنصر است. [۳]
 
456
 
 
457
نظريه فيزيک کوانتم تصوير پيچيده ای از اتم ارائه ميدهد و اين پيچيدگی دانشمندان را مجبور ميکند که جهت توصيف خواص اتم بجای يک تصوير متوسل به تصاوير شهودی متفاوتی از اتم شوند. بعضی وقت ها مناسب است که به الکترون به عنوان يک ذره متحرک به دور هسته نگاه کرد و گاهی مناسب است به آنها عنوان ذراتی که در امواجی با موقعيت ثابت در اطراف هسته (مدار: orbits) توزيع شده اند نگاه کرد. ساختار مدار ها تا حد بسيار زيادی روی رفتار اتم تأثير گذارده و خواص شيميايی يک ماده توسط نحوه دسته بندی اين مدار ها معين ميشود.[۲]
 
458
فهرست مندرجات
 
459
[نهفتن]
 
460
 
 
461
    * ۱ اجزا
 
462
          o ۱.۱ ذرات بنیادی
 
463
          o ۱.۲ هسته
 
464
          o ۱.۳ ابر الکتررونی
 
465
    * ۲ مدل‌های اتمی
 
466
          o ۲.۱ مدل اتمی دالتون
 
467
          o ۲.۲ مدل اتمی تامسن
 
468
          o ۲.۳ مدل اتمی رادرفورد
 
469
          o ۲.۴ مدل اتمی لایه‌ای
 
470
    * ۳ منبع
 
471
 
 
472
[ویرایش] اجزا
 
473
 
 
474
جهت بررسی اجزاء يک ماده، ميتوان به صورت پی در پی آن را تقسيم کرد. اکثر مواد موجود در طبيعت ترکيب شلوغی از مولکول های مختلف است. با تلاش نسبتاً کمی ميتوان اين مولکول ها را از هم جدا کرد. مولکول ها خودشان متشکل از اتم ها هستند که توسط پيوند های شيميايی به هم پيوند خورده اند. با مصرف انرژی بيشتری ميتوان اتم ها را از مولکول ها جدا کرد. اتم ها خود از اجزاء ريزتری بنام هسته و الکترون تشکيل شده که توسط نيرو های الکتريکی به هم پيوند خورده اند و شکستن آنها انرژی بسی بيشتری طلب ميکند. اگر سعی در شکستن اين اجرا زير اتمی با صرف انرژی زياد بکنيم، کار ما باعث توليد شدن ذرات جديدی ميشويم که خيلی از آنها بار الکتريکی دارند. [۲]
 
475
 
 
476
همانطور که اشاره شد اتم از هسته و الکترون تشکيل شده است. جرم اصلی اتم در هسته قرار دارد؛ فضای اطراف هسته عموماً فضای خالی ميباشد. هسته خود از پروتن (که بر مثبت دارد)، و نوترن (که بر خنثی دارد) تشکيل شده. الکترون هم بار منفی دارد. اين سه ذره عمری طولانی داشته و در تمامی اتم های معمولی که به صورت طبيعی تشکيل ميشوند يافت ميشود. بجز اين سه ذره، ذرات ديگری نيز در ارتباط با آنها ممکن است موجود باشد؛ ميتوان اين ذرات ديگر را با صرف انرژی زياد نيز توليد کرد ولی عموماً اين ذرات زندگی کوتاهی داشته و از بين ميروند.[۲]
 
477
 
 
478
اتم ها مستقل از اينکه چند الکترون داشته باشند (۳ تا يا ۹۰ تا)، همه تقريباً يک اندازه دارند. به صورت تقريبی اگر ۵۰ ميليون اتم را کنار هم روی يک خط بگذاريم، اندازه آن يک سانتيمتر ميشود. به دليل اندازه کوچک اتم ها، آنها را با واحدی به نام انگسترم که برابر ۱۰- ۱۰ متر است مي سنجند.[۲]
 
479
 
 
480
[ویرایش] ذرات بنیادی
 
481
 
 
482
    نوشتار اصلی: ذرات زیراتمی
 
483
 
 
484
[ویرایش] هسته
 
485
 
 
486
    نوشتار اصلی: هسته اتم
 
487
 
 
488
[ویرایش] ابر الکتررونی
 
489
 
 
490
[ویرایش] مدل‌های اتمی
 
491
 
 
492
[ویرایش] مدل اتمی دالتون
 
493
 
 
494
نظریهٔ اتمی دالتون: دالتون نظریه اتمی خود را با اجرای آزمایش در هفت بند بیان کرد.
 
495
 
 
496
    * ماده از ذره‌های تجزیه ناپذیری به نام اتم ساخته شده‌است.
 
497
    * همهٔ اتم‌ها یک عنصر، مشابه یکدیگرند.
 
498
    * اتم‌ها نه به وجود می‌آیند و نه از بین می‌روند.
 
499
    * همهٔ اتم‌های یک عنصر جرم یکسان و خواص شیمیایی یکسان دارند.
 
500
    * اتم‌های عنصرهای مختلف به هم متصل می‌شوند و مولکول‌ها را به وجود می‌آورند.
 
501
    * در هر مولکول از یک ترکیب معین، همواره نوع و تعداد نسبی اتم‌های سازنده ی آن یکسان است.
 
502
    * واکنش‌های شیمیایی شامل جابه جایی اتم‌ها و یا تغییر در شیوهٔ اتصال آن‌ها است.
 
503
 
 
504
نظریه‌های دالتون نارسایی‌ها و ایرادهایی دارد و اما آغازی مهم بود. مواردی که نظریهٔ دالتون نمی‌توانست توجیه کند:
 
505
 
 
506
    * پدیدهٔ برقکافت (الکترولیز) و نتایج مربوط به آن
 
507
    * پیوند یونی ـ فرق یون با اتم خنثی
 
508
    * پرتو کاتدی
 
509
 
 
510
    * پرتوزایی و واکنش‌های هسته‌ای
 
511
    * مفهوم ظرفیت در عناصر گوناگون
 
512
    * پدیدهٔ ایزوتوپی
 
513
 
 
514
قسمت اول نظریهٔ دالتون تأیید فیلسوف یونانی (دموکریت) بود.
 
515
 
 
516
نظریهٔ دالتون از سه قسمت اصلی (قانون بقای جرم ـ قانون نسبت‌ها معین ـ قانون نسبت‌های چندگانه) می‌باشد.
 
517
 
 
518
مطالعهٔ اتم‌ها و ذرات ریزتر فقط به صورت غیرمستقیم و از روی رفتار (خواص) امکان پذیر است.
 
519
 
 
520
اولین ذرهٔ زیراتمی شناخته شده الکترون است. مواردی که به کشف و شناخت الکترون منجر شد:
 
521
 
 
522
    * الکتریسیتهٔ ساکن یا مالشی
 
523
    * پدیدهٔ الکترولیز (برقکافت)
 
524
    * پرتو کاتدی
 
525
    * ۴پدیدهٔ پرتوزایی
 
526
 
 
527
[ویرایش] مدل اتمی تامسن
 
528
 
 
529
مدل اتمی تامسون (کیک کشمشی، مدل هندوانه‌ای یا ژله میوه دار)
 
530
 
 
531
    * الکترون با بار منفی، درون فضای ابرگونه با بار مثبت، پراکنده شده‌اند.
 
532
    * اتم در مجموع خنثی است. مقدار با مثبت با بار منفی برابر است.
 
533
    * این ابر کروی مثبت، جرمی ندارد و جرم اتم به تعداد الکترون آن بستگی دارد.
 
534
    * جرم زیاد اتم از وجود تعداد بسیار زیادی الکترون در آن ناشی می‌شود.
 
535
 
 
536
[ویرایش] مدل اتمی رادرفورد
 
537
 
 
538
1)هر اتم دارای یک هسته کوچک است که بیشتر جرم اتم در آن واقع است.
 
539
 
 
540
2)هسته اتم دارای بار الکتریکی مثبت است.
 
541
 
 
542
3)حجم هسته در مقایسه با حجم اتم بسیار کوچک است زیرا بیشتر حجم اتم را فضای خالی تشکیل میدهد.
 
543
 
 
544
4)هسته اتم بوسیله الکترونها محاصره شده است.
 
545
 
 
546
[ویرایش] مدل اتمی لایه‌ای
 
547
 
 
548
[ویرایش] منبع
 
549
""")
 
550
        ]
 
551
        for name,text in testset:
 
552
                l=ngram.guessLanguage(text.decode("utf-8"))
 
553
                print name,l, name==l[1]
 
554
                if not name==l[1]:print "guessed",l,"_________"
 
555
                
 
556
        print ngram.highestNgramMatches(testset[-1][1].decode("utf-8"))
 
557
        print ngram.allLanguages()
 
558