def filter_tweet(tweet, langs=['en']): try: # Extracts urls urls = re.findall('http[s]?:\\\/\\\/(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', tweet['text'] ) text = tweet['text'].encode('utf-8') # Accepts Only: # English Tweets # Without urls # No RTs # No Replies if ( languageIdentifier.identify(text, 300, 300) in langs and "retweeted_status" not in tweet and len(urls) < 1 and 'http' not in tweet['text'].lower() # Need to fix this latter >.< and not 'rt' == text[:2].lower() and not '@' in tweet['text'].lower() # No Replies or mentions for a while ;D ): return True else: return False except Exception, error: #print error return False
def callback(self, channel, method, properties, body): item = self.decode(body) text = self._remove_repetition(item['_tmp_']['text_full']).lower() lang_twitter = "" if item.has_key('lang'): lang_twitter = item['lang'] elif 'retweeted_status' in item and 'lang' in item['retweeted_status']: lang_twitter = item['retweeted_status']['lang'] #Remove URLs, hashtags e mentions do texto if not item['_tmp_']['type'] == 'forum' and not item['_tmp_'][ 'type'] == 'news': if item.has_key('entities'): partes = item['entities']['user_mentions'][:] partes.extend(item['entities']['urls']) partes.extend(item['entities'].get('media', [])) partes = sorted( partes, cmp=lambda x, y: cmp(x['indices'][0], y['indices'][0])) offset = 0 for entity in partes: entity['indices'] = [ int(entity['indices'][0]), int(entity['indices'][1]) ] text = text[0:entity['indices'][0] - offset] + text[entity['indices'][1] - offset:] offset += entity['indices'][1] - entity['indices'][0] for expr in self.expr: text = expr[0].sub(expr[1], text) lang_text_identified = languageIdentifier.identify( text.encode('utf8'), 300, 300) #@UndefinedVariable lang = lang_text_identified ''' Bloco abaixo utilizado para identificação de idioma em fórum. Se 60% do texto for do idioma EN, é atribuido este idioma ao texto. Caso contrário, é atribuido o idioma PT ao texto. ''' if (not lang == 'pt') and (item['_tmp_']['type'] == 'forum'): ER = re.compile( 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', re.IGNORECASE) ER1 = re.compile('(#.*?(\s|$))', re.IGNORECASE) tmp_text = ER1.sub('', ER.sub('', item['text'])) identify_text = tmp_text.split('\n') dic_lang = {} for identify_part in identify_text: new_lang = languageIdentifier.identify( identify_part.encode('utf8'), 300, 300) if not dic_lang.has_key(new_lang): dic_lang[new_lang] = 1 else: dic_lang[new_lang] = dic_lang[new_lang] + 1 count_other_lang = 0 count_en = 0 for key in dic_lang: if key == 'en': count_en += dic_lang[key] else: count_other_lang += dic_lang[key] percentage_en = 0.0 if count_en > 0: percentage_en = count_en / (count_other_lang + count_en) if percentage_en > 0.6: lang = 'en' else: lang = 'pt' contexto = self.get_contexto(method, item) #Testa se a interface do Twitter está em português. contexto_info = self.workflow.get(contexto).get('lang') # Avalia se o idioma configurado para a interface do usuário é pt. if item['_tmp_']['type'] == 'tweets': langs = contexto_info.get('use-lang-if-equals', []) if lang_twitter in langs or True: if lang_text_identified != lang_twitter: #Conflito de idioma description = "" if item.has_key('user') and item['user'].get( 'description', None): description = self._remove_repetition( item['user']['description']).lower() lang_score = {lang_text_identified: 1} if lang_twitter and lang_twitter.strip(): lang_score[lang_twitter] = 1 for l in langs: if l not in lang_score: lang_score[l] = 0 #Tenta pela descrição do usuário if description.strip(): lang_description_identified = languageIdentifier.identify( description.encode('utf8'), 300, 300) # @UndefinedVariable #print "Descrip", description, lang_description_identified if lang_description_identified in lang_score: lang_score[lang_description_identified] += 1 #Tenta pelo perfil do usuário if 'lang' in item['user']: profile_lang = item['user'].get('lang') if profile_lang in lang_score: lang_score[profile_lang] += 1 sorted_score = sorted(lang_score.iteritems(), key=lambda x: x[1], reverse=True) if sorted_score[0][1] == 1: if item['user']['location']: #Apenas 1 voto location_lang = languageIdentifier.identify( item['user']['location'].encode('utf8'), 300, 300) if location_lang in lang_score: lang = location_lang elif 'pt' in lang_score and lang_score['pt']: lang = 'pt' else: lang = sorted_score[0][0] else: lang = lang_twitter elif sorted_score[0][1] == lang_score.get(lang_twitter, 0): lang = lang_twitter else: lang = sorted_score[0][0] #print lang_score #if 'it' == lang: # print lang_text_identified,"|", lang_twitter, "|", langs, "|", text, # print "Score", lang_score # raw_input("Diferente ({}): {} {} , resultado: {} \n> ".format(item['_id'], lang_text_identified, lang_twitter, lang)) #print '-' * 50 #print lang, lang_twitter, lang_text_identified #marcacao da versao e operaciao if not item['_tmp_']['type'] == 'news': item['control']['last'] = 'LANG' item['control']['lang'] = {'lang': lang} self._fill_version_info(VERSION, item['control']['lang']) if not lang in ['pt', 'en', 'es']: lang = 'Unknown' try: doc_type_info = contexto_info.get(item['_tmp_']['type'], contexto_info.get('*')) routing_key = '%s.%s' % ( contexto, doc_type_info.get(lang, doc_type_info.get('*'))) if item['_tmp_']['type'] == 'news': item['_tmp_'].pop('text_full') item['_tmp_']['type'] = lang + '_news' item.pop('agg_type') item.pop('type') item.pop('doc_id') print routing_key print item #print contexto_info, item['_id'], lang_twitter, routing_key #print item.get('lang'), item['control']['lang'], item['text'] #print '-'*10 #print lang #print '-'*10 #raw_input('Pressione enter \n > ') self.publish(EXCHANGE_NAME, routing_key, self.encode(item), durable=True) #print routing_key, doc_type_info, lang, item['lang'] channel.basic_ack(delivery_tag=method.delivery_tag) except AttributeError: print "Ignorando", contexto, item['_tmp_']['type'], lang routing_key = "Nenhuma" if contexto == '201': print contexto_info.get( item['_tmp_']['type'], contexto_info.get( '*')), contexto_info, '>>>', doc_type_info self.counter += 1 if self.counter == 1000: print '[LANG] %d docs' % self.counter self.counter = 0 return (EXCHANGE_NAME, routing_key)
#!/usr/bin/env python # -*- coding: utf-8 -*- import languageIdentifier languageIdentifier.load() print languageIdentifier.identify("This is a short english string?", 300, 300), "English" print languageIdentifier.identify("ليل مواقع احبك موت,دردشة,شات,منتديات,احبك,منتدى,دلي", 300, 300), "Arabic" print languageIdentifier.identify("La vitamina A o retinol es una vitamina o un calcio liposoluble; ayuda a la formación y mantenimiento de dientes sanos y tejidos blandos y óseo", 300, 300), "Spanish" print languageIdentifier.identify("Á, ou A accent aigu, est un graphème utilisé dans les alphabets féringien, hongrois, islandais, slovaque et tchèque en tant que lettre et dans les alphabets", 300, 300), "French" print languageIdentifier.identify("Первый Альтернативный Музыкальный Телеканал - альтернативная музыка, новости музыки, клипы, форум о музыке.", 300, 300), "Russian" print languageIdentifier.identify("Die Übersetzung der Präposition à hängt stark von dem jeweiligen Kontext ab. Da im Französischen nicht dekliniert wird,", 300, 300), "German" print languageIdentifier.identify("這是具有歷史意義的一部A 片(雖然不是我們的歷史~); 有劇情(雖然我覺得A 片幹嘛要有劇情?哪個人看A 片會像看電影", 300, 300), "Chinese" print languageIdentifier.identify("ラテン文字(アルファベット)の1番目の文字。小文字は a 。ギリシャ文字のΑ(アルファ)に由来し、キリル文字のАに相当する ... この文字が表す音素は原則として[a](非円唇前舌広母音)もしくは[ɑ](非円唇後舌広母音", 300, 300), "Japanese" print languageIdentifier.identify("lettera dell'alfabeto latino e italiano e anche nella maggior parte degli alfabeti derivanti da quello fenicio.", 300, 300), "Italian" print languageIdentifier.identify("선박 운송 전문업체, 서비스 포트정보와 해외지사 소개, 운항스케쥴, 고객 서비스 제공.", 300, 300), "Korean" print languageIdentifier.identify("Det gemena a:et finns utformat i två versioner (allografer): det så kallade envånings-a:et med en våning (ɑ) och det så kallade tvåvånings-a:et med två", 300, 300), "Swedish" print languageIdentifier.identify("A ni herufi ya kwanza katika alfabeti ya Kilatini ambayo ni pia mwandiko wa Kiswahili cha kisasa. Asili yake ni Alfa ya Kigiriki.", 300, 300), "Swahili" print languageIdentifier.identify("Å je písmeno v abecedě některých jazyků (švédština, finština, dánština, norština, severofríština, valonština, chamorro, istro-románské jazyky), kde označuje", 300, 300), "Czech" print languageIdentifier.identify("What is a paradigm? In my own words, a paradigm is a belief system. It can be a personal belief system, or one held by a mass number of people, or even the whole world. Such a belief system is so entrenched in our minds as truth that it usually does not occur to us to question it. Therefore, many of us never even think that maybe this thought pattern needs updating. But, inevitably there are those that go against the common thought, and begin to challenge long held beliefs. More and more people begin to awaken, each individual begins to change their personal belief system, and the phenomenon that occurs as this old belief system comes tumbling down is often referred to as a paradigm shift", 300, 300), "English" print languageIdentifier.identify("旧Kの現Aは久しぶりの公演なのかwww RT @akb_rss: [倉持明日香] (初・ω・) ノ: さあ! いよいよ A6th初日です|q∀`*))★ 久しぶりの劇場公演。 楽しみすぎるっ (●´∀`●) ... http://bit.ly/chy8Ue #akb48", 300, 300), "Japanese" print languageIdentifier.identify("自抽耳光 会在转化为 抽人耳光 这帮奴才 RT @haojinsong 湖北涉事警察自抽耳光道歉http://news.163.com/10/0726/00/6CFSTGNM00011229.html", 300, 300), "Chinese" print languageIdentifier.identify("好人不当村长,好人当上也会被... RT @gzgy123: RT @global70: 劉巍律師關注白虎頭村 RT @CitizenRight: RT @yuanxinting: RT @liuweilawyers: 今天有消息传出,村长许坤被施酷刑,情况严重,请大家关注", 300, 300), "Chinese" print languageIdentifier.identify("RT @WuyouLan 我一直以為我不是女士呢>@thisisxiaoxie: @WuyouLan 俺一直以为你是女士呢!心里经常发言:介个女滴很、厉、害、呀!呵呵~~", 300, 300), "Chinese" print languageIdentifier.identify("@haruca さわったりくちづけしたり、そりゃもうあーた(ry", 300, 300), "Japanese" print languageIdentifier.identify("遅くまでお疲れ様です。これからの夕飯?美味しいものに巡り会える事をお祈りします(^^;; RT @tukeuchiessence @taruyajusuke 食べたい!食べたい!食べた〜い!こちらは演劇人祭舞台稽古終わりました〜", 300, 300), "Japanese" print languageIdentifier.identify("今ならさいとうごぼう店いったことあることが自慢できるうう! (#dommune live at http://ustre.am/dhFr )", 300, 300), "Japanese" print languageIdentifier.identify("@tomozoushopフォローありがとうございます^^よろしくお願いします☆", 300, 300), "Japanese" print languageIdentifier.identify("女子でピンクのテレキャスは、舐められまっせ!!(違う)", 300, 300), "Japanese" print languageIdentifier.identify("(2010.07.28.未明入力)<br />「TTファイル」とこれは、境目がごっちゃだなぁ……☆<br /> (^へ^;)”<br /><blockquote> ひと<br /> 大学非常勤講師の使い捨てや過酷な待遇の改善に奔走<br /> (略)さん(48)<br /><br /> 憲法など授業は週5日、13コマ。自宅のある神奈川から千葉、東京、埼玉の6カ所を分単位で移動する平均5時間強の通勤にヘトヘト。「毎日が小旅行です」<br /> 大学非常勤講師の平均像は45歳、年収300万円、研究費は自腹、96%が社会保険未加入、突然の雇い止めにおびえる日々。「採用者の機嫌を損ねたらアウト。子どもが病気でも休めない」<br /> 雇い止めトラブルに遭い10年前、首都圏大学非常勤講師組合に加入。5年前に“匿名”で委員長に就任しました。今は「私の後ろには声をあげられない人がいっぱい。私が風よけになる」と公然と名乗って、仲間の待遇改善に奔走中です。<br /> 大学教員の父を見て「好きな事で稼げる」と学者の道へ。しかし博士になっても既婚女性は非常勤で当然という扱い。男性も選任教員からあぶれる状況で「数年の冷や飯は覚悟したけどこれほどひどいとは…」<br /> 夫や子どもたち “家族が保険” です。「家族の支えのない人は、一歩間違えればどん底。専門家が社会に役立つ場はあるはずなのに」<br /> 信仰心ゼロで入った宗教系大学でショックを受けて「国家と宗教」を専門に。性格・思想信条・病気など本人が変えられない物事を理由に少数者を社会から排除する動きが許せません。性的少数者とともに、戸籍の性別を変更できる法律制定へ駆け回り、関係者が連帯し声を上げれば世の中は変わると実感しました。<br /> 「タイムマシンで過去に戻っても、また学者かな」<br /><br />(文・ 中村 秀生)<br />(日本共産党 http://www.jcp.or.jp/<br /> 機関紙「しんぶん赤旗」http://www.jcp.or.jp/akahata<br /> 2010.07.27.)</blockquote><br /><br /><blockquote> 公務災害を認める<br /> うつ病で自殺の芦屋市職員に<br /> 兵庫<br /><br /> 阪神大震災の復興事業などを担当し、2002年にうつ病から自殺した兵庫県芦屋市の男性職員=当時(41)=について、地方公務員災害補償基金兵庫県支部が、民間企業の労災に相当する公務災害と認定していたことが26日、市への取材で分かりました。精神疾患の公務災害が認められる例は珍しいといいます。<br /> 男性は(略)1カ月の超過勤務が100時間を超えたことが何度もありました。01年3月にはうつ病と診断され、市は職場を変えましたが02年5月に自殺しました。<br /> 遺族は同年9月に同災害基金県支部に公務災害認定を申請しましたが、因果関係はないとして退けられました。不服申し立てを受け、同支部審査会が業務は質的、量的にも過重で、うつ病は公務に起因すると判断したため、同支部は昨年12月に公務災害と認定しました。(略)<br /><br />(日本共産党 http://www.jcp.or.jp/<br /> 機関紙「しんぶん赤旗」http://www.jcp.or.jp/akahata<br /> 2010.07.27.)</blockquote><br /><br /><blockquote> 希望者全員を正社員に<br /> 応募者への4段階評価やめよ<br /> 日本郵政に山下議員が要請<br /><br /> 日本共産党の山下芳生参院議員は26日、日本郵政グループで働く非正規雇用社員の10万人を正社員化するにあたって、郵政グループから進ちょく状況の説明を受け、希望者全員が正社員として採用されるべきだと要望しました。<br /> 郵政グループは、5月に勤続3年以上で、週所定労働時間が30時間以上という応募要件を発表。6月には「週所定労働時間が30時間に満たない(20時間以上に限る)であっても、長期にわたり勤務しており、上記要件に準ずると所属長が求める場合には、応募できる」と要件を緩和しています。現在、正社員への応募者数は3万4098人です。<br /> このなかで山下議員は、応募者に対し所属長が事前に、「是非正社員に登用すべきと考える」「登用の可否は一次・二次審査の結果次第と考える」「正社員に登用できる水準にあるか判断に迷う」「正社員に登用できる水準にないと考える」と、4段階の評価をおこなっていることを批判、「所属長の恣意(しい)的な判断、ふりわけにならざるをえない。これはやめるべきだ」と求めました。(略)希望者全員が正社員になれるようにすべきだと訴えました。<br /><br />(日本共産党 http://www.jcp.or.jp/<br /> 機関紙「しんぶん赤旗」http://www.jcp.or.jp/akahata<br /> 2010.07.27.)</blockquote><br /><br /><blockquote> 奴隷制度 まだあった<br /> イエメン<br /><br />【カイロ=時事】アラビア半島南西端の貧困国イエメンで、共和制に移行した1962年に廃止されたはずの奴隷制度がひそかに存続していることを地元紙が暴露、人権団体などが対応に乗り出しています。<br /> 地元人権団体によると、奴隷制度が残存しているのは西部ハッジャ、フダイダ両州で、約500人の奴隷がいるとされます。奴隷を所有するのは、大規模農園主や地元有力者。権利証書だけで取引される奴隷は、農作業や政府と対立した際の実力行使役、性的行為の提供といった見返りに金銭は支払われず、住む場所と食事が与えられるだけだといいます。<br /> 奴隷使用は法律で禁止されていますが、奴隷を使う農園主や有力者の多くが親政権の立場を取っており、権力基盤の弱いサレハ政権は事実上黙認しています。<br /> 世襲の奴隷集団は11、12世紀に地域を支配した勢力の子孫とされ、たたかいに破れた後に奴隷化されました。<br /> 人権団体は、地元有力者や議員らによる委員会を設置。奴隷解放を拒否する人物に対する訴訟を起こすほか、元奴隷に住宅や農地の提供を進めるよう政府に働き掛ける計画です。<br /><br />(日本共産党 http://www.jcp.or.jp/<br /> 機関紙「しんぶん赤旗」http://www.jcp.or.jp/akahata<br /> 2010.07.27.)</blockquote><br /><br />", 300, 300), "Japanese" print languageIdentifier.identify("@vicfall2 백현이는 요슴제 비싼거라 폰 공짜일건데요~^^;;", 300, 300), "BLANK"
#!/usr/bin/env python # -*- coding: utf-8 -*- import languageIdentifier languageIdentifier.load() print languageIdentifier.identify("This is a short english string?", 300, 300), "English" print languageIdentifier.identify( "ليل مواقع احبك موت,دردشة,شات,منتديات,احبك,منتدى,دلي", 300, 300), "Arabic" print languageIdentifier.identify( "La vitamina A o retinol es una vitamina o un calcio liposoluble; ayuda a la formación y mantenimiento de dientes sanos y tejidos blandos y óseo", 300, 300), "Spanish" print languageIdentifier.identify( "Á, ou A accent aigu, est un graphème utilisé dans les alphabets féringien, hongrois, islandais, slovaque et tchèque en tant que lettre et dans les alphabets", 300, 300), "French" print languageIdentifier.identify( "Первый Альтернативный Музыкальный Телеканал - альтернативная музыка, новости музыки, клипы, форум о музыке.", 300, 300), "Russian" print languageIdentifier.identify( "Die Übersetzung der Präposition à hängt stark von dem jeweiligen Kontext ab. Da im Französischen nicht dekliniert wird,", 300, 300), "German" print languageIdentifier.identify( "這是具有歷史意義的一部A 片(雖然不是我們的歷史~); 有劇情(雖然我覺得A 片幹嘛要有劇情?哪個人看A 片會像看電影", 300, 300), "Chinese" print languageIdentifier.identify( "ラテン文字(アルファベット)の1番目の文字。小文字は a 。ギリシャ文字のΑ(アルファ)に由来し、キリル文字のАに相当する ... この文字が表す音素は原則として[a](非円唇前舌広母音)もしくは[ɑ](非円唇後舌広母音", 300, 300), "Japanese" print languageIdentifier.identify( "lettera dell'alfabeto latino e italiano e anche nella maggior parte degli alfabeti derivanti da quello fenicio.", 300, 300), "Italian"