1
# -*- coding: utf-8 -*-
3
import os, sys, re, codecs, glob, unicodedata, re
4
from operator import itemgetter
5
from heapq import nlargest
17
'bi':'Bislama (currently also used by Bitruscan and Tok Pisin)',
22
'cdo':'Cantonese (Roman script)',
30
'dk':'Danish (wrong name)',
44
'gd':'Scottish Gaelic',
63
'ks':'Ekspreso, but should become Kashmiri',
78
'nb':'Norwegian (Bokmal)',
82
'nn':'Norwegian (Nynorsk)',
89
'roa-rup':'Aromanian',
92
'sh':'OBSOLETE, Serbocroatian',
94
'simple':'Simple English',
107
'tokipona':'Toki Pona',
123
'zh-cn':'Simplified Chinese',
124
'zh-tw':'Traditional Chinese'
127
rtlLanguages=['Arabic','Hebrew','Pashto','Persian','Urdu']
129
decPunctex=re.compile(ur"\d*\W*", re.U+re.I)
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.
139
for elem in iterable:
140
bag[elem] = bag_get(elem, 0) + 1
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]
153
self.charnum = 200 # if too small, doesn't recognize chinese!
155
self.freqmulti = 1000000
157
self.langfolder = "./languages"
158
self.langext = "lang.txt"
161
self.replare = re.compile(r"\s+")
165
("Lo","HANGUL","ko"),
166
("Lo","HIRAGANA","ja"),
167
("Lo","KATAKANA","ja"),
170
("Lo","GUJARATI","gu"),
171
("Lo","GEORGIAN","ka"),
172
("Lo","BENGALI","bn"),
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")
188
def guessLanguage(self,text, removeDecPunct=False):
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
197
langCat, langK = self.mostCommonUnicodeKeys(decPunctex.sub(" ", text))
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:
204
# if verbose: print self.highestNgramMatches(text)
205
res = self.highestNgramMatches(text)
206
if res: return res[0]
207
else: return 100,name
209
return 0, "unknown language! information: "+langCat+" "+ langK
211
def guessLanguageRealName(self,text):
213
wrapper class for guessLanguage
217
return langs.get(self.guessLanguage(text)[1],"an unknown language, maybe "+str(self.mostCommonUnicodeKeys(text)))
219
def distance(self,text,lang):
222
text = self.replare.sub("_"," "+text+" ".lower())
225
# computing the value added for each ngram found
226
addValue = int((1.0/textlen)*self.freqmulti)
228
textNgrams = self.ngramList(text,self.n,addValue)[:self.ngramnum]
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()]
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" )
249
self.ngrams[language][g]=int(f)
251
print "error in file",filename
253
def allLanguages(self):
255
gives a list of all languages we have information about
259
for cat,key,name in self.charGuesser:
260
if name != "ngram":codes+=[name]
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]
268
codes=list(set(codes))
271
names+= [langs.get(c,c)]
274
def makeNgrams(self):
275
folder = os.path.join(self.langfolder,'*'+self.langext)
276
if verbose: print "making",str(self.n)+"-grams..."
278
for infilename in glob.glob(os.path.normcase(folder)): # for each minicorpus of a language
279
language = infilename.split("/")[-1].split(".")[0]
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" )
286
text = self.replare.sub("_"," "+text+" ".lower())
288
if textlen==0:continue
289
#invlen = 1.0/textlen
290
addValue = int((1.0/textlen)*self.freqmulti)
293
sordico = self.ngramList(text,self.n,addValue)[:self.ngramnum]
296
#self.ngrams[language]=sordico
299
outfile.write(g+"\t"+str(f)+"\n")
302
print " done",number,"languages"
304
def ngramList(self,text,n,addValue):
306
for a text, the size of the ngram and the value to add for each ngram found,
307
the function gives back
311
for i in range(len(text)-n):
313
thesengrams[nuple]=thesengrams.get(nuple,0)+addValue
314
sordico = [(f,g) for g,f in thesengrams.iteritems()]
320
def mostCommonUnicodeKeys(self,text):
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)
328
* Lu - uppercase letters
329
* Ll - lowercase letters
330
* Lt - titlecase letters
331
* Lm - modifier letters
333
* Nl - letter numbers
334
* Mn - nonspacing marks
335
* Mc - spacing combining marks
336
* Nd - decimal numbers
337
* Pc - connector punctuations
340
if textlen<2:return "",""
341
text = self.replare.sub(" ",text)
345
# for f,c in self.ngramList(text,1,1.0/textlen):
346
# cat = unicodedata.category(c)
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]
356
for f,c in frequentChars:
357
# print "*",f,c,"*****"
358
langCats+=[unicodedata.category(c)]
359
langKeys+=[unicodedata.name(c).split()[0]]
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]
368
def highestNgramMatches(self, text):
371
gives back a list of all (score,language_code), starting with the highest score
375
text = self.replare.sub("_"," "+text+" ".lower())
380
# computing the value added for each ngram found
381
addValue = int((1.0/textlen)*self.freqmulti)
382
#if verbose: print "addValue",addValue
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
389
textNgrams = self.ngramList(text,self.n,addValue)[:self.ngramnum]
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()]
402
def extractGoodLanguageParags(self, text, goodLanguageCode):
404
for sentence in text.split("\n"):
405
if self.guessLanguage(sentence)[1]==goodLanguageCode:
406
newtext+=sentence+"\n"
410
################################################# end of class Ngram #############################"
413
if __name__ == "__main__":
419
("ar","تاگلديت ن لمغرب"),
420
("fa","برای دیدن موارد مربوط به گذشته صفحهٔ بایگانی را ببینید."),
421
("ps","""، کړ و وړو او نورو راز راز پژني او رواني اکرو بکرو... څرګندويي کوي او د چاپېريال او مهال څيزونه، ښکارندې، پېښې،ښه او بد... رااخلي. په بله وينا: ژبه د پوهاوي راپوهاوي وسيله ده.د ژبې په مټ خپل اندونه،واندونه (خيالونه)، ولولې، هيلې او غوښتنې سيده يا ناسيده، عمودي يا افقي نورو ته لېږدولای شو. خبرې اترې يې سيده او ليکنه يې ناسيده ډول دی.که بيا يې هممهالو ته لېږدوو، افقي او که راتلونکو پښتونو( نسلونو) ته يې لېږدوو، عمودي بلل کېږي."),"""),
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","भारतीय रेल्वे (संक्षेपः भा. रे.) ही भारताची सरकार-नियंत्रित सार्वजनिक रेल्वेसेवा आहे. भारतीय रेल्वे जगातील सर्वात मोठ्या रेल्वेसेवांपैकी एक आहे. भारतातील रेल्वेमार्गांची एकूण लांबी ६३,१४० कि.मी. "),
432
ویکیپدیا یک پروژهٔ ناسودبر است: لطفاً امروز کمک کنید.
435
حمایت از ویکیپدیا: یک پروژهٔ ناسودبر.
438
از ویکیپدیا، دانشنامهٔ آزاد
439
پرش به: ناوبری, جستجو
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.
444
کوچکترین جز در شیمی عناصر
452
قطر : (قطر به عنصر و ایزتوپ اتم بستگی دارد) 31 pm (He) تا 520 pm (Cs)
453
انواع اتمهای که تاکنون دیده شدهاست: ~1080[۱]
455
اتم کوچکترین واحد تشکیل دهنده یک عنصر شیمیایی است که خواص منحصر به فرد آن عنصر را حفظ میکند. تعريف ديگری آن را به عنوان کوچکترين واحدی در نظر ميگيرد که ماده را ميتوان به آن تقسيم کرد بدون اينکه اجزاء بارداری از آن خارج شود.[۲] اتم ابری الکترونی، تشکیلشده از الکترونها با بار الکتریکی منفی، که هستهٔ اتم را احاطه کردهاست. هسته نیز خود از پروتون که دارای بار مثبت است و نوترون که از لحاظ الکتریکی خنثی است تشکیل شده است. زمانی که تعداد پروتونها و الکترونهای اتم با هم برابر هستند اتم از نظر الکتریکی در حالت خنثی یا متعادل قرار دارد در غیر این صورت آن را یون مینامند که میتواند دارای بار الکتریکی مثبت یا منفی باشد. اتمها با توجه به تعداد پروتونها و نوترونهای آنها طبقهبندی میشوند. تعداد پروتونهای اتم مشخص کننده نوع عنصر شیمیایی و تعداد نوترونها مشخصکننده ایزوتوپ عنصر است. [۳]
457
نظريه فيزيک کوانتم تصوير پيچيده ای از اتم ارائه ميدهد و اين پيچيدگی دانشمندان را مجبور ميکند که جهت توصيف خواص اتم بجای يک تصوير متوسل به تصاوير شهودی متفاوتی از اتم شوند. بعضی وقت ها مناسب است که به الکترون به عنوان يک ذره متحرک به دور هسته نگاه کرد و گاهی مناسب است به آنها عنوان ذراتی که در امواجی با موقعيت ثابت در اطراف هسته (مدار: orbits) توزيع شده اند نگاه کرد. ساختار مدار ها تا حد بسيار زيادی روی رفتار اتم تأثير گذارده و خواص شيميايی يک ماده توسط نحوه دسته بندی اين مدار ها معين ميشود.[۲]
466
o ۲.۱ مدل اتمی دالتون
468
o ۲.۳ مدل اتمی رادرفورد
469
o ۲.۴ مدل اتمی لایهای
474
جهت بررسی اجزاء يک ماده، ميتوان به صورت پی در پی آن را تقسيم کرد. اکثر مواد موجود در طبيعت ترکيب شلوغی از مولکول های مختلف است. با تلاش نسبتاً کمی ميتوان اين مولکول ها را از هم جدا کرد. مولکول ها خودشان متشکل از اتم ها هستند که توسط پيوند های شيميايی به هم پيوند خورده اند. با مصرف انرژی بيشتری ميتوان اتم ها را از مولکول ها جدا کرد. اتم ها خود از اجزاء ريزتری بنام هسته و الکترون تشکيل شده که توسط نيرو های الکتريکی به هم پيوند خورده اند و شکستن آنها انرژی بسی بيشتری طلب ميکند. اگر سعی در شکستن اين اجرا زير اتمی با صرف انرژی زياد بکنيم، کار ما باعث توليد شدن ذرات جديدی ميشويم که خيلی از آنها بار الکتريکی دارند. [۲]
476
همانطور که اشاره شد اتم از هسته و الکترون تشکيل شده است. جرم اصلی اتم در هسته قرار دارد؛ فضای اطراف هسته عموماً فضای خالی ميباشد. هسته خود از پروتن (که بر مثبت دارد)، و نوترن (که بر خنثی دارد) تشکيل شده. الکترون هم بار منفی دارد. اين سه ذره عمری طولانی داشته و در تمامی اتم های معمولی که به صورت طبيعی تشکيل ميشوند يافت ميشود. بجز اين سه ذره، ذرات ديگری نيز در ارتباط با آنها ممکن است موجود باشد؛ ميتوان اين ذرات ديگر را با صرف انرژی زياد نيز توليد کرد ولی عموماً اين ذرات زندگی کوتاهی داشته و از بين ميروند.[۲]
478
اتم ها مستقل از اينکه چند الکترون داشته باشند (۳ تا يا ۹۰ تا)، همه تقريباً يک اندازه دارند. به صورت تقريبی اگر ۵۰ ميليون اتم را کنار هم روی يک خط بگذاريم، اندازه آن يک سانتيمتر ميشود. به دليل اندازه کوچک اتم ها، آنها را با واحدی به نام انگسترم که برابر ۱۰- ۱۰ متر است مي سنجند.[۲]
482
نوشتار اصلی: ذرات زیراتمی
486
نوشتار اصلی: هسته اتم
488
[ویرایش] ابر الکتررونی
490
[ویرایش] مدلهای اتمی
492
[ویرایش] مدل اتمی دالتون
494
نظریهٔ اتمی دالتون: دالتون نظریه اتمی خود را با اجرای آزمایش در هفت بند بیان کرد.
496
* ماده از ذرههای تجزیه ناپذیری به نام اتم ساخته شدهاست.
497
* همهٔ اتمها یک عنصر، مشابه یکدیگرند.
498
* اتمها نه به وجود میآیند و نه از بین میروند.
499
* همهٔ اتمهای یک عنصر جرم یکسان و خواص شیمیایی یکسان دارند.
500
* اتمهای عنصرهای مختلف به هم متصل میشوند و مولکولها را به وجود میآورند.
501
* در هر مولکول از یک ترکیب معین، همواره نوع و تعداد نسبی اتمهای سازنده ی آن یکسان است.
502
* واکنشهای شیمیایی شامل جابه جایی اتمها و یا تغییر در شیوهٔ اتصال آنها است.
504
نظریههای دالتون نارساییها و ایرادهایی دارد و اما آغازی مهم بود. مواردی که نظریهٔ دالتون نمیتوانست توجیه کند:
506
* پدیدهٔ برقکافت (الکترولیز) و نتایج مربوط به آن
507
* پیوند یونی ـ فرق یون با اتم خنثی
510
* پرتوزایی و واکنشهای هستهای
511
* مفهوم ظرفیت در عناصر گوناگون
514
قسمت اول نظریهٔ دالتون تأیید فیلسوف یونانی (دموکریت) بود.
516
نظریهٔ دالتون از سه قسمت اصلی (قانون بقای جرم ـ قانون نسبتها معین ـ قانون نسبتهای چندگانه) میباشد.
518
مطالعهٔ اتمها و ذرات ریزتر فقط به صورت غیرمستقیم و از روی رفتار (خواص) امکان پذیر است.
520
اولین ذرهٔ زیراتمی شناخته شده الکترون است. مواردی که به کشف و شناخت الکترون منجر شد:
522
* الکتریسیتهٔ ساکن یا مالشی
523
* پدیدهٔ الکترولیز (برقکافت)
527
[ویرایش] مدل اتمی تامسن
529
مدل اتمی تامسون (کیک کشمشی، مدل هندوانهای یا ژله میوه دار)
531
* الکترون با بار منفی، درون فضای ابرگونه با بار مثبت، پراکنده شدهاند.
532
* اتم در مجموع خنثی است. مقدار با مثبت با بار منفی برابر است.
533
* این ابر کروی مثبت، جرمی ندارد و جرم اتم به تعداد الکترون آن بستگی دارد.
534
* جرم زیاد اتم از وجود تعداد بسیار زیادی الکترون در آن ناشی میشود.
536
[ویرایش] مدل اتمی رادرفورد
538
1)هر اتم دارای یک هسته کوچک است که بیشتر جرم اتم در آن واقع است.
540
2)هسته اتم دارای بار الکتریکی مثبت است.
542
3)حجم هسته در مقایسه با حجم اتم بسیار کوچک است زیرا بیشتر حجم اتم را فضای خالی تشکیل میدهد.
544
4)هسته اتم بوسیله الکترونها محاصره شده است.
546
[ویرایش] مدل اتمی لایهای
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,"_________"
556
print ngram.highestNgramMatches(testset[-1][1].decode("utf-8"))
557
print ngram.allLanguages()