def __init__(self):
     self._detectEncoding = DetectEncoding()
     self._defaultEncodeText = "utf-8"
     self.setNormalizeTextEncode(self._defaultEncodeText)
     self._diacritics = re.compile(
         u'[\u0300-\u036f\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]', re.U)
     self._detection = Detection()
     self._porterStemming = PorterStemming()
 def __init__(self):
     self._detectEncoding = DetectEncoding()
     self._defaultEncodeText = "utf-8"
     self.setNormalizeTextEncode(self._defaultEncodeText)
     self._diacritics = re.compile(u'[\u0300-\u036f\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]', re.U)
     self._detection = Detection()
     self._porterStemming = PorterStemming()
class SimpleNormalization(Normalization):
    """ Класс реализующий простую нормализацию текста """

    def __init__(self):
        self._detectEncoding = DetectEncoding()
        self._defaultEncodeText = "utf-8"
        self.setNormalizeTextEncode(self._defaultEncodeText)
        self._diacritics = re.compile(u'[\u0300-\u036f\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]', re.U)
        self._detection = Detection()
        self._porterStemming = PorterStemming()

    def normalizeText(self, text):
        if not text:
            raise ParamError("Text is not to be None or ''")

        dt = self._detectEncoding.encodeText(text, self._defaultEncodeText)  # dt = decode text
        ndt = self._diacritics.sub('', unicodedata.normalize('NFD', unicode(dt, self._defaultEncodeText)))
        ndt = ndt.lower().replace("\n", " ").strip()

        n_w = []  # normalize words
        if ndt:
            temp_normalize_words = re.split('\s+', ndt)
            for word in temp_normalize_words:
                unicode_word = self._normalizeWord(word)

                lang = self._detection.detect(unicode_word)
                normalize_word = unicode_word

                if lang == 1:
                    normalize_word = self._porterStemming.stem(unicode_word)
                elif lang == 2:
                    normalize_word = self._porterStemming.stemRu(unicode_word)

                # чтобы не добавлять пустые строки. Пример ""
                if normalize_word:
                    n_w.append(normalize_word)
        else:
            try:
                n_w = re.split('\s+', ndt)
            except Exception as e:
                print("Error parse {0}".format(str(e)))

        return [self._detectEncoding.encodeText(item.encode(self._defaultEncodeText), self.getNormalizeTextEncode()) for
                item in n_w]

    def normalizeTextWithoutRepetition(self, text):
        return list(set(self.normalizeText(text)))

    def setNormalizeTextEncode(self, normalizeTextEncode):
        """
        Установить кодировку для нормализованного текста

        :param normalizeTextEncode:  название кодировки (по-умолчанию utf-8)
        """
        self._normalizeTextEncode = normalizeTextEncode

    def getNormalizeTextEncode(self):
        """
        Получить кодировку для нормализованного текста

        :return:  название кодировки (по умолчанию utf-8)
        """
        return self._normalizeTextEncode

    def _normalizeWord(self, word):
        """
        Убрать из начала и конца слова все символы не из алфавита

        :param word: слово
        :return: нормализованное слово
        """

        unicodeWord = word
        try:
            unicodeWord = word.decode("utf-8")
        except UnicodeEncodeError:
            # print "UnicodeEncodeError"
            pass

        wordLen = len(unicodeWord)

        if wordLen == 0:
            return unicodeWord

        f_index = 0  # индекс первого символа
        s_index = wordLen - 1  # индекс последнего символа

        # ищем позицию первого индекса
        for x in range(0, wordLen):
            f_index = x
            if self._detection.check_symbol(unicodeWord[x]):
                break

        for x in range(s_index, f_index, -1):
            s_index = x
            if self._detection.check_symbol(unicodeWord[x]):
                break

        if f_index + 1 >= s_index:
            return unicodeWord[f_index]

        return unicodeWord[f_index: s_index + 1]

    normalizeTextEncode = property(getNormalizeTextEncode, setNormalizeTextEncode)
class SimpleNormalization(Normalization):
    """ Класс реализующий простую нормализацию текста """
    def __init__(self):
        self._detectEncoding = DetectEncoding()
        self._defaultEncodeText = "utf-8"
        self.setNormalizeTextEncode(self._defaultEncodeText)
        self._diacritics = re.compile(
            u'[\u0300-\u036f\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]', re.U)
        self._detection = Detection()
        self._porterStemming = PorterStemming()

    def normalizeText(self, text):
        if not text:
            raise ParamError("Text is not to be None or ''")

        dt = self._detectEncoding.encodeText(
            text, self._defaultEncodeText)  # dt = decode text
        ndt = self._diacritics.sub(
            '',
            unicodedata.normalize('NFD', unicode(dt, self._defaultEncodeText)))
        ndt = ndt.lower().replace("\n", " ").strip()

        n_w = []  # normalize words
        if ndt:
            temp_normalize_words = re.split('\s+', ndt)
            for word in temp_normalize_words:
                unicode_word = self._normalizeWord(word)

                lang = self._detection.detect(unicode_word)
                normalize_word = unicode_word

                if lang == 1:
                    normalize_word = self._porterStemming.stem(unicode_word)
                elif lang == 2:
                    normalize_word = self._porterStemming.stemRu(unicode_word)

                # чтобы не добавлять пустые строки. Пример ""
                if normalize_word:
                    n_w.append(normalize_word)
        else:
            try:
                n_w = re.split('\s+', ndt)
            except Exception as e:
                print("Error parse {0}".format(str(e)))

        return [
            self._detectEncoding.encodeText(
                item.encode(self._defaultEncodeText),
                self.getNormalizeTextEncode()) for item in n_w
        ]

    def normalizeTextWithoutRepetition(self, text):
        return list(set(self.normalizeText(text)))

    def setNormalizeTextEncode(self, normalizeTextEncode):
        """
        Установить кодировку для нормализованного текста

        :param normalizeTextEncode:  название кодировки (по-умолчанию utf-8)
        """
        self._normalizeTextEncode = normalizeTextEncode

    def getNormalizeTextEncode(self):
        """
        Получить кодировку для нормализованного текста

        :return:  название кодировки (по умолчанию utf-8)
        """
        return self._normalizeTextEncode

    def _normalizeWord(self, word):
        """
        Убрать из начала и конца слова все символы не из алфавита

        :param word: слово
        :return: нормализованное слово
        """

        unicodeWord = word
        try:
            unicodeWord = word.decode("utf-8")
        except UnicodeEncodeError:
            # print "UnicodeEncodeError"
            pass

        wordLen = len(unicodeWord)

        if wordLen == 0:
            return unicodeWord

        f_index = 0  # индекс первого символа
        s_index = wordLen - 1  # индекс последнего символа

        # ищем позицию первого индекса
        for x in range(0, wordLen):
            f_index = x
            if self._detection.check_symbol(unicodeWord[x]):
                break

        for x in range(s_index, f_index, -1):
            s_index = x
            if self._detection.check_symbol(unicodeWord[x]):
                break

        if f_index + 1 >= s_index:
            return unicodeWord[f_index]

        return unicodeWord[f_index:s_index + 1]

    normalizeTextEncode = property(getNormalizeTextEncode,
                                   setNormalizeTextEncode)