#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@package eWRT.stat.language
language detection
'''
import re
from glob import glob
from os.path import basename
import unittest
from eWRT.util.module_path import get_resource
[docs]def read_wordlist(fname):
''' reads a language wordlist from a file '''
with open(fname) as f:
return set(map(str.lower, map(str.strip, f.readlines())))
# returns the language name based on the language file's name
get_lang_name = lambda fname: basename(fname).split(".")[0]
LANG_DATA_DIR = get_resource(__file__, 'data')
##
# \var STOPWORD_DICT: a dictionary of the 100 most common words in the given language
STOPWORD_DICT = {get_lang_name(fname): read_wordlist(fname) for fname in glob(LANG_DATA_DIR+"/*.csv")}
DELETE_CHARS = {ch: None for ch in ",.!?\"'"}
[docs]def detect_language(text):
''' detects the most probable language for the given text '''
if not text.strip():
return None
text = text.lower()
text = re.sub(r'[^\w]', ' ', text)
words = [word.strip() for word in text.translate(DELETE_CHARS).split(" ")]
current_lang = None
current_wordcount = 0
for lang, reference_wordlist in STOPWORD_DICT.items():
wordcount = sum([1 for word in words if word in reference_wordlist])
if wordcount >= current_wordcount and wordcount > 0:
current_wordcount = wordcount
current_lang = lang
return current_lang
[docs]class DetectLanguageTest(unittest.TestCase):
[docs] def test_detect_language(self):
''' tests the language detection based on examples '''
text = u"#maryboo #health #baby #mom #food #cosmetics #love http://t.co/nPqzL8MRKa"
#RT @LesbianGIFs_: She's HOT AF đ©đ„ http://t.co/xZ2VFdAtNx
print(detect_language(text))
text = u'''Das GlĂŒck der Erde liegt in diesem Fall im Dreck. Begeistert
werfen sich die SchĂŒler einer zweiten Klasse Volksschule
Erdklumpen auf die grĂŒnen T-Shirts. Andere rennen lachend herum,
reiĂen verstohlen Sauerampfer aus dem Beet und stecken sich die
BlÀtter in den Mund.'''
print(detect_language(text))
assert detect_language(text) == 'de'
text = u'''Deux nouveaux décÚs par crise cardiaque en lien avec la
consommation de boissons énergisantes ont été signalés aux
autorités sanitaires, a indiqué mercredi 6 juin au soir l'agence
de sécurité sanitaire pour l'alimentation (Anses).'''
assert detect_language(text) == 'fr'
text = u'''Weniger 1V-Renten, mehr Pensionskassengelder ZĂRICH. Immer weniger Leute beziehen eine IVunsere PensionskassenGuthaben: Sie wachsen. Seit 2003 ist die Zahl der jĂ€hrlich neu zugesprochenen Renten bei der Invalidenversicherung (IV) um mehr als 47% gesUnken. «Wir fĂŒhren das auf die 5. IVG-Revision, die relativ stabile Wirtschaftslage und die Fortschritte bei der Wiedereingliederung zurĂŒck», sagt Zurich-Sprecher Frank Keidel. Vom starken RĂŒckgang profitiert nicht nur die IV als erste SĂ€ule, sondern alle ErwerbstĂ€tigen. Denn dank der gesunkenen Zahl der Invaliden mĂŒssen auch die Pensionskassen weniger IV-RentenbeitrĂ€ge aus der zweiten SĂ€ule ausschĂŒtten. Unter dem Strich bleibt deshalb viel mehr Geld fĂŒr die Altersvorsorge. Die BeitrĂ€ge der zweiten SĂ€ule setzen sich zusammen aus IV-, Todesfall- und KostenprĂ€mie. Eine Umfrage von 20 Minuten bei den Versicherungen zeigt, dass die RisikoprĂ€mten fĂŒr InvaliditĂ€t teils um 10 bis 20% gesenkt werden konnten. «Oberdurchschnittlich konnten wIr 2011 die PrĂ€mien im Gross- und Detailhandel, bei Optikern, Apotheken und Drogerien senken», so Allianz-Suisse-SprecherBernddeWall. Ebenfalls stark profitiert hĂ€tten Elektro-, SanitĂ€r- und LĂŒftungsinstallateure, Maler, Gipser und Glaser Bei Swlss Life sanken die PrĂ€mien seit 2007 durchschnittlich um %. Auch Axa Wmterthur hat in den letzten Jahren die Taufe bereits dreimal gesenkt. Und mit der teilautonomen Sanimelstiftung Vita plant sie fĂŒr 2013 eine durchschnittliche r? /2 1 1 IV-Renten sind rOckilufig. FOTOLIA Senkung der PrĂ€mien von rund 300 Franken pro versicherte Person. ELISABEflI RIZZI'''
assert detect_language(text) == 'de'
[docs] def test_exceptions(self):
''' results for empyt strings '''
assert detect_language(u" ") == None
assert detect_language(u"") == None
if __name__ == '__main__':
unittest.main()