Example #1
0
        if obj_unificado == None:
            pos_verb = "Verb"
            if pos == pos_verb:
                palavra = BaseOx.lematizador.lemmatize(palavra, pos=pos[0].lower())
                try:
                    if retornar_pos == True:
                        return self.obter_definicoes(palavra, pos_verb)
                    else:
                        return [(d, pos_verb) for d in  self.obter_definicoes(palavra, pos_verb)]
                except Exception, e:
                    return None
        try:
            # Se POS = None, pegue todas as POS
            if pos != None:
                pos = Util.cvrsr_pos_wn_oxford(pos)

                if pos in obj_unificado:
                    obj_unificado = { pos: obj_unificado[pos] }
                else:
                    obj_unificado = dict()
            else:
                pass

            todas_definicoes = [ ]
        except (TypeError, AttributeError), e:
            return [ ]

        try:
            for pos in obj_unificado:
                for def_primaria in obj_unificado[pos]:
    def obter_frases_exemplo(palavra):
        ext = ExtratorWikipedia(None)

        url = Util.CONFIGS['wikipedia'][
            'url_desambiguacao'] % palavra.capitalize()

        duplicatas = set()

        frases_desambiguadads = {}
        todas_definicoes = {}

        instance = BaseOx.INSTANCE

        links_relevantes_tmp = ext.obter_links_relevantes_desambiguacao(
            url, palavra)

        pagina_desambiguacao = not links_relevantes_tmp in [None, [], {}]

        if pagina_desambiguacao == False:
            url = Util.CONFIGS['wikipedia'][
                'url_base_verbete'] + '/' + palavra.lower()
            links_relevantes_tmp = [url]

        links_relevantes_tmp = [
            l for l in links_relevantes_tmp if not "dictiona" in l
        ]
        links_relevantes = []

        todos_sins = []

        lemas = {}
        url_lema = {}

        for def_iter in BaseOx.obter_definicoes(instance, palavra, pos=None):
            conj_sins = BaseOx.obter_sins(instance,
                                          palavra,
                                          def_iter,
                                          pos=None)
            todos_sins += conj_sins

        todos_sins = [palavra] + list(set(todos_sins))

        for l in links_relevantes_tmp:
            for s in todos_sins:
                if s.lower() in l.lower() and not l in links_relevantes:
                    links_relevantes.append(l)
                    if not s.lower() in lemas: lemas[s.lower()] = []
                    lemas[s.lower()].append(l)
                    url_lema[l] = s.lower()

        links_relevantes_tmp = None

        registros = []

        for url in links_relevantes:
            if "wikipedia" in url:
                texto_wikipedia, todas_urls_referencias = ext.obter_texto(
                    url, obter_referencias=True)
                plain_text = Util.completa_normalizacao(texto_wikipedia)

                if set(nltk.word_tokenize(plain_text)).intersection(
                        set(todos_sins)):
                    todas_sentencas = re.split('[.?!]', plain_text)
                    descricao = todas_sentencas[0].replace('\n',
                                                           ' ').strip(' ')
                    todas_sentencas = todas_sentencas[1:]
                    todas_sentencas = [
                        re.sub('[\s\n\t]', ' ', s) for s in todas_sentencas
                    ]
                    todas_sentencas = [
                        s for s in todas_sentencas if s.count(' ') > 1
                    ]
                    for frase in todas_sentencas:
                        if len(set(frase).intersection(
                                set("<>{ }"))) > 0 or not '":"' in frase:
                            if ExtratorWikipedia.filtrar_frase_bruta(
                                    frase, url_lema[url]) != None:
                                nova_frase = frase.replace('\n',
                                                           ' ').strip(' ')
                                if not nova_frase in duplicatas:
                                    reg = palavra, descricao, url, nova_frase
                                    registros.append(reg)
                                    duplicatas.add(nova_frase)

                # Iterando referencias recuperadas
                for url_ref in todas_urls_referencias:
                    for frase in ext.extrair_frases_pagina_comum(
                            todas_urls_referencias, palavra):
                        nova_frase = frase.replace('\n', ' ').strip(' ')
                        if not nova_frase in duplicatas:
                            reg = palavra, descricao, url + '@@@@' + url_ref, nova_frase
                            registros.append(reg)
                            duplicatas.add(nova_frase)

        return registros
 def completa_normalizacao(cadeia, codif='utf-8'):
     return Util.completa_normalizacao(cadeia, codif=codif)
Example #4
0
    def assinatura_significado(self, lema, lematizar=True,\
                            stem=False, stop=True,\
                            extrair_relacao_semantica=False,\
                            usar_exemplos=False):

        resultado = BaseOx.construir_objeto_unificado(self.base_ox, lema)

        if not resultado:
            resultado = {}

        lema = lemmatize(lema)

        assinaturas_significados = []  # (nome, definicao, exemplos)

        for pos in resultado.keys():
            todos_significados = resultado[pos].keys()

            indice = 1
            for sig in todos_significados:
                nome_sig = "%s.%s.%d" % (lema, pos, indice)
                indice += 1

                if usar_exemplos:
                    exemplos = resultado[pos][sig]['exemplos']
                else:
                    exemplos = []

                # nome, definicao, exemplos, assinatura
                definicao_corrente = [nome_sig, sig, exemplos, []]
                assinaturas_significados.append(definicao_corrente)

                # Colocando exemplos na assinatura
                definicao_corrente[len(definicao_corrente) -
                                   1] += self.assinatura_significado_aux(
                                       lema, pos, sig, exemplos)

                sig_secundarios = resultado[pos][sig]['def_secs']

                for ss in sig_secundarios:
                    nome_sig_sec = "%s.%s.%d" % (lema, pos, indice)

                    if usar_exemplos:
                        exemplos_secundarios = resultado[pos][sig]['def_secs'][
                            ss]['exemplos']
                    else:
                        exemplos_secundarios = []

                    definicao_corrente_sec = [
                        nome_sig_sec, ss, exemplos_secundarios, []
                    ]
                    assinaturas_significados.append(definicao_corrente_sec)

                    definicao_corrente_sec[
                        len(definicao_corrente) -
                        1] += self.assinatura_significado_aux(
                            lema, pos, ss, exemplos_secundarios)

                    indice += 1

        for sig in assinaturas_significados:
            sig[3] = Util.normalizar_ctx(sig[3],
                                         stop=True,
                                         lematizar=True,
                                         stem=True)

        return [tuple(a) for a in assinaturas_significados]
Example #5
0
 def retornar_valida(self, frase):
     return Util.retornar_valida(frase)
Example #6
0
                palavra = BaseOx.lematizador.lemmatize(palavra,
                                                       pos=pos[0].lower())
                try:
                    if retornar_pos == True:
                        return self.obter_definicoes(palavra, pos_verb)
                    else:
                        return [
                            (d, pos_verb)
                            for d in self.obter_definicoes(palavra, pos_verb)
                        ]
                except Exception, e:
                    return None
        try:
            # Se POS = None, pegue todas as POS
            if pos != None:
                pos = Util.cvrsr_pos_wn_oxford(pos)

                if pos in obj_unificado:
                    obj_unificado = {pos: obj_unificado[pos]}
                else:
                    obj_unificado = dict()
            else:
                pass

            todas_definicoes = []
        except (TypeError, AttributeError), e:
            return []

        try:
            for pos in obj_unificado:
                for def_primaria in obj_unificado[pos]:
Example #7
0
    def adapted_lesk(self,
                     ctx,
                     ambigua,
                     pos,
                     nbest=True,
                     lematizar=True,
                     stem=True,
                     stop=True,
                     usr_ex=False,
                     janela=2):

        if len(pos) == 1:
            pos = Util.cvrsr_pos_wn_oxford(pos)

        limiar_polissemia = 10

        # Casamentos cartesianos das diferentes definicoes
        solucoes_candidatas = []

        # Todas definicoes da palavra ambigua
        definicoes = [
            def_ox for def_ox in BaseOx.obter_definicoes(ambigua, pos)
        ]

        ctx_blob = TextBlob(ctx)

        tags_validas = self.cfgs['pos_tags_treebank']
        tokens_validos = [(token, tag) for (token, tag) in ctx_blob.tags
                          if tag in tags_validas]

        tokens_validos_tmp = []

        # [('The', 'DT'), ('titular', 'JJ'), ('threat', 'NN'), ('of', 'IN'), ...]
        for token, tag in tokens_validos:
            pos_ox = Util.cvrsr_pos_wn_oxford(tag[0].lower())

            defs_token = BaseOx.obter_definicoes(token, pos_ox)
            if not defs_token in [[], None]:
                tokens_validos_tmp.append((token, tag))
                solucoes_candidatas.append(defs_token)

        tokens_validos = tokens_validos_tmp
        tokens_validos_tmp = None

        indices_tokens_validos = []

        if len(tokens_validos) != len(solucoes_candidatas):
            raise Exception("\nTAMANHOS DIFERENTES!\n")

        i = 0
        for tk, tag in list(tokens_validos):
            if tk == ambigua:
                cont = 0
                for e in sorted(range(0, i), reverse=True):
                    if len(solucoes_candidatas[e]) < limiar_polissemia:
                        indices_tokens_validos.append(e)
                        cont += 1
                    if cont == janela:
                        break

                indices_tokens_validos.append(i)

                cont = 0
                for d in range(i + 1, len(tokens_validos)):
                    if len(solucoes_candidatas[d]) < limiar_polissemia:
                        indices_tokens_validos.append(d)
                        cont += 1
                    if cont == janela:
                        break

            i += 1

        tokens_validos = [tokens_validos[i] for i in indices_tokens_validos]

        print("\n")
        print("AMBIGUA: '%s'" % ambigua)
        print("CONTEXTO: '%s'\n" % ctx)
        print("TOKENS VALIDOS: " + str([(token, tag)
                                        for (token, tag) in tokens_validos]))
        prod = 1
        print("\n\n")
        print([len(solucoes_candidatas[i]) for i in indices_tokens_validos])
        for e in [solucoes_candidatas[i] for i in indices_tokens_validos]:
            prod *= len(e)
        print("Produtorio: " + str(prod))
        raw_input("\n")

        for dtmp in definicoes:
            d = str(dtmp).lower()

            todos_tamanhos_ngram = sorted(range(1, self.tam_max_ngram + 1),
                                          reverse=True)

            for n in todos_tamanhos_ngram:
                ctx_blob = TextBlob(ctx.lower())
                todos_ngrams = ctx_blob.ngrams(n=n)

                for ngram in todos_ngrams:
                    ngram_str = " ".join(ngram)
                    freq = d.count(ngram_str)
                    pontuacao = freq * (n**2)

                    if freq:
                        d = d.replace(ngram_str, '')

        return 0.00
Example #8
0
                        BaseOx.INSTANCE, lema_caminho, def_caminho, pos)

                    if sins_defcaminho:
                        lista_exemplos.append(" ".join(sins_defcaminho))

                    # Adicionando definicao
                    lista_exemplos.append(def_caminho)

                for ex_iter in lista_exemplos[:maximo_exemplos]:
                    ex = ex_iter

                    ex_blob = TextBlob(ex)
                    exemplos_blob.append(ex_blob)

                    for token in ex_blob.words:
                        if Util.is_stop_word(token.lower()) == False:
                            token_lematizado = lemmatize(token)
                            uniao_palavras_sem_duplicatas.add(token_lematizado)
                            uniao_palavras_com_duplicatas.append(
                                token_lematizado)

            except Exception, caminho:
                import traceback

                traceback.print_stack()
                traceback.print_exc()

                exemplos = []

            tb_vocab_duplicatas = TextBlob(
                " ".join(uniao_palavras_com_duplicatas))
Example #9
0
    def des_exemplos(self, ctx,\
                    ambigua, pos, nbest=True,\
                    lematizar=True, stem=True, stop=True,\
                    normalizar_pont=True):

        cfgs = self.cfgs
        dir_bases = self.cfgs['caminho_bases']
        base_ox = self.base_ox

        rep_vet = self.rep_vetorial
        alvaro = Alvaro.Alvaro.INSTANCE

        dir_cache_rel_sinonimia = cfgs['caminho_bases'] + '/' + cfgs['oxford'][
            'cache']['sinonimia']
        chave_cache_relacao_sin = "%s-%s.json" % (ambigua, pos)
        dir_obj = dir_cache_rel_sinonimia + '/' + chave_cache_relacao_sin

        if not chave_cache_relacao_sin in Util.list_arqs(
                dir_cache_rel_sinonimia):
            rel_definicoes = alvaro.construir_relacao_definicoes(
                ambigua, pos, fontes='oxford')
            Util.salvar_json(dir_obj, rel_definicoes)
        else:
            rel_definicoes = Util.abrir_json(dir_obj, criarsenaoexiste=False)

        res_des_tmp = []
        pontuacao_somada = 0.00

        for def_ambigua in rel_definicoes:
            uniao_palavras_sem_duplicatas = set()
            uniao_palavras_com_duplicatas = list()
            exemplos_blob = []

            palavras_tf = {}

            try:
                maximo_exemplos = self.cfgs['params_exps']['qtde_exemplos'][0]
                lista_exemplos = BaseOx.obter_atributo(ambigua, pos,
                                                       def_ambigua, 'exemplos')
                # Adicionando lemas
                lista_exemplos.append(" ".join(
                    BaseOx.obter_sins(ambigua, def_ambigua, pos)))
                # Adicionando definicao
                lista_exemplos.append(def_ambigua)

                for ex in lista_exemplos[:maximo_exemplos]:
                    ex_blob = TextBlob(ex)
                    exemplos_blob.append(ex_blob)
                    for token in ex_blob.words:
                        if Util.is_stop_word(token.lower()) == False:
                            token_lematizado = lemmatize(token)
                            uniao_palavras_sem_duplicatas.add(token_lematizado)
                            uniao_palavras_com_duplicatas.append(
                                token_lematizado)

            except Exception, caminho:
                exemplos = []

            textblob_vocab = TextBlob(" ".join(uniao_palavras_com_duplicatas))

            palavras_latentes = []
            for p in textblob_vocab.word_counts:
                if textblob_vocab.word_counts[p] > 1:
                    palavras_latentes.append(p)

            palavras_derivadas = []

            for p in uniao_palavras_sem_duplicatas:
                tf = alvaro.tf(p, textblob_vocab)
                palavras_tf[p] = tf

            pontuacao = 0.00

            for t in Util.tokenize(Util.resolver_en(ctx).lower()):
                try:
                    pontuacao += palavras_tf[t]
                except:
                    pontuacao += 0.00

            pontuacao_somada += pontuacao

            try:
                if normalizar_pont:
                    reg_pont = pontuacao / sum(palavras_tf.values())
                else:
                    reg_pont = pontuacao
            except ZeroDivisionError, zde:
                reg_pont = 0.00
def cosine_lesk_inventario_estendido(context_sentence, ambiguous_word, \
    pos=None, lemma=True, stem=True, hyperhypo=True, \
    stop=True, context_is_lemmatized=False, \
    nbest=False, synsets_signatures=None, busca_ampla=False):
    """
	In line with vector space models, we can use cosine to calculate overlaps
	instead of using raw overlap counts. Essentially, the idea of using
	signatures (aka 'sense paraphrases') is lesk-like.
	"""

    # Ensure that ambiguous word is a lemma.
    if lemma:
        ambiguous_word = lemmatize(ambiguous_word)

    # If ambiguous word not in WordNet return None
    #if not wn.synsets(ambiguous_word):
    if not criar_inventario_des_wn(ambiguous_word, busca_ampla=busca_ampla):
        return None

    if context_is_lemmatized:
        context_sentence = " ".join(context_sentence.split())
    else:
        context_sentence = " ".join(lemmatize_sentence(context_sentence))

    scores = []

    chave_assinatura = "%s.%s.%s.%s.%s.%s" % (ambiguous_word, pos, lemma, stem,
                                              hyperhypo, busca_ampla)

    if not chave_assinatura in DesWordnet.cache_assinaturas:
        synsets_signatures = simple_signature(ambiguous_word,
                                              pos,
                                              lemma,
                                              stem,
                                              hyperhypo,
                                              busca_ampla=busca_ampla)

        DesWordnet.cache_assinaturas[chave_assinatura] = []

        for ss, signature in synsets_signatures.items():
            # Lowercase and replace "_" with spaces.
            signature = " ".join(map(str, signature)).lower().replace("_", " ")
            # Removes punctuation.
            signature = [i for i in Util.word_tokenize(signature) \
               if i not in string.punctuation]

            signature = Util.normalizar_ctx(signature,
                                            stop=stop,
                                            lematizar=lemma,
                                            stem=stem)

            scores.append((cos_sim(context_sentence, " ".join(signature)), ss))

            DesWordnet.cache_assinaturas[chave_assinatura].append(
                (ss, signature))

    else:
        synsets_signatures = DesWordnet.cache_assinaturas[chave_assinatura]

        for ss, signature in synsets_signatures:
            scores.append((cos_sim(context_sentence, " ".join(signature)), ss))

    if not nbest:
        return sorted(scores, reverse=True)[0][1]
    else:
        return [(j, i) for i, j in sorted(scores, reverse=True)]
    def extrair_sinonimos(self, ctx, palavra, pos=None, \
          usar_exemplos=False, busca_ampla=False, \
          repetir=True, coletar_todos=True):

        max_sinonimos = 10

        print('Executando desambiguador Wordnet...')
        resultado = self.adapted_cosine_lesk(ctx,
                                             palavra,
                                             pos,
                                             busca_ampla=busca_ampla)
        print('Desambiguador executado...\n')

        sinonimos = []

        try:
            if resultado[0][1] == 0:
                resultado = [resultado[0]]
                repetir = False

                if False:
                    sinonimos = []
                    try:
                        for synset in [s[0] for s in resultado]:
                            for lema in synset.lemma_names():
                                if not l in sinonimos:
                                    sinonimos.append(l)
                    except:
                        pass

                    return sinonimos[:max_sinonimos]
            else:
                resultado = [item for item in resultado if item[1] > 0]
        except:
            resultado = []

        continuar = bool(resultado)

        while len(sinonimos) < max_sinonimos and continuar:
            len_sinonimos = len(sinonimos)

            for item in resultado:
                synset, pontuacao = item

                if len(sinonimos) < max_sinonimos:
                    try:
                        sinonimos_tmp = [
                            s for s in synset.lemma_names()
                            if not Util.e_mpalavra(s)
                        ]
                        sinonimos_tmp = list(
                            set(sinonimos_tmp) - set(sinonimos))

                        if coletar_todos: sinonimos += sinonimos_tmp
                        elif sinonimos_tmp: sinonimos += [sinonimos_tmp[0]]

                    except:
                        pass
                else:
                    continuar = False

            if repetir == False: continuar = False
            elif len_sinonimos == len(sinonimos): continuar = False

        return sinonimos[:max_sinonimos]
Example #12
0
    def construir_objeto_unificado(self, palavra):
        palavra_sing = Util.singularize(palavra)

        if palavra in BaseOx.objs_unificados:
            return BaseOx.objs_unificados[palavra]

        dir_bases = self.cfgs['caminho_bases']
        dir_cache_oxford = self.cfgs['oxford']['cache']
        nome_arq = palavra + '.json'

        dir_obj_definicoes = dir_bases + '/' + dir_cache_oxford[
            'definicoes'] + '/' + nome_arq
        dir_obj_extrator = dir_bases + '/' + dir_cache_oxford[
            'extrator_web'] + '/' + nome_arq
        dir_obj_sinonimos = dir_bases + '/' + dir_cache_oxford[
            'sinonimos'] + '/' + nome_arq

        obj_definicoes = Util.abrir_json(dir_obj_definicoes,
                                         criarsenaoexiste=False)
        obj_extrator = Util.abrir_json(dir_obj_extrator,
                                       criarsenaoexiste=False)

        if obj_definicoes == None or obj_definicoes == {}:
            obj_definicoes = CliOxAPI.obter_definicoes(CliOxAPI.CLI, palavra)
            Util.salvar_json(dir_obj_definicoes, obj_definicoes)

        if not dir_obj_sinonimos in BaseOx.objs_sinonimos_inatingiveis:
            obj_sinonimos = Util.abrir_json(dir_obj_sinonimos,
                                            criarsenaoexiste=False)

            if obj_sinonimos in [None, {}]:
                obj_sinonimos = self.cli_api_ox.obter_sinonimos(palavra)
                if obj_sinonimos in [None, {}] and palavra_sing != palavra:
                    obj_sinonimos = self.cli_api_ox.obter_sinonimos(
                        palavra_sing)
            if obj_sinonimos:
                Util.salvar_json(dir_obj_sinonimos, obj_sinonimos)
                if palavra_sing != palavra:
                    dir_obj_sinonimos = dir_bases + '/' + dir_cache_oxford[
                        'sinonimos'] + '/' + palavra_sing + '.json'
                    Util.salvar_json(dir_obj_sinonimos, obj_sinonimos)
            else:
                BaseOx.objs_sinonimos_inatingiveis.add(palavra)
                BaseOx.objs_sinonimos_inatingiveis.add(palavra_sing)

        if obj_extrator == None:
            obj_extrator = self.extrator_web_ox.iniciar_coleta(palavra)

            if obj_extrator != None and obj_extrator != {}:
                Util.salvar_json(dir_obj_extrator, obj_extrator)

                dir_obj_extrator_sing = dir_bases + '/' + dir_cache_oxford[
                    'extrator_web'] + '/' + palavra_sing + '.json'

                if dir_obj_extrator_sing != dir_obj_extrator:
                    Util.salvar_json(dir_obj_extrator_sing, obj_extrator)

                return obj_extrator

            else:

                obj_extrator = self.extrator_web_ox.iniciar_coleta(
                    palavra_sing)

                if obj_extrator != None and obj_extrator != {}:
                    Util.salvar_json(dir_obj_extrator, obj_extrator)

                    dir_obj_extrator_sing = dir_bases + '/' + dir_cache_oxford[
                        'extrator_web'] + '/' + palavra_sing + '.json'

                    if dir_obj_extrator_sing != dir_obj_extrator:
                        Util.salvar_json(dir_obj_extrator_sing, obj_extrator)

                    return obj_extrator

            return {}

        # Processando definicoes
        obj_join_definicoes = {}

        # Processando definicoes extrator
        obj_join_extrator = {}
        for pos in obj_extrator:
            for def_prim in obj_extrator[pos]:
                k_reg = pos + self.cfgs['separador'] + def_prim[:-1].lower()
                obj_join_extrator[k_reg] = obj_extrator[pos][def_prim][
                    'exemplos']
                for def_sec in obj_extrator[pos][def_prim]['def_secs']:
                    k_reg = pos + self.cfgs['separador'] + def_sec[:-1].lower()
                    obj_join_extrator[k_reg] = obj_extrator[pos][def_prim][
                        'def_secs'][def_sec]['exemplos']

        if not obj_definicoes or not obj_sinonimos:
            return obj_extrator

        for pos in obj_definicoes:
            for reg in obj_definicoes[pos]:
                if 'thesaurusLinks' in reg:
                    k_reg = pos + self.cfgs['separador'] + reg[
                        'thesaurusLinks'][0]['sense_id']
                    if 'definitions' in reg:
                        obj_join_definicoes[k_reg] = reg['definitions']
                        if 'subsenses' in reg:
                            for reg_sub in reg['subsenses']:
                                try:
                                    k_reg = pos + self.cfgs[
                                        'separador'] + reg_sub[
                                            'thesaurusLinks'][0]['sense_id']
                                except:
                                    k_reg = pos + self.cfgs[
                                        'separador'] + reg_sub['id']
                                try:
                                    obj_join_definicoes[k_reg] = reg_sub[
                                        'definitions']
                                except:
                                    pass
                                try:
                                    k_reg = pos + self.cfgs['separador'] + reg[
                                        'thesaurusLinks'][0]['sense_id']
                                    if k_reg in obj_join_definicoes:
                                        obj_join_definicoes[k_reg] += reg_sub[
                                            'definitions']
                                    else:
                                        obj_join_definicoes[k_reg] = reg_sub[
                                            'definitions']
                                except:
                                    pass
                    else:
                        pass
                else:
                    pass

        obj_unificado = dict(obj_extrator)
        # Processando sinonimos
        obj_join_sinonimos = {}

        for pos in obj_sinonimos:
            for reg in obj_sinonimos[pos]:
                k_reg = pos + self.cfgs['separador'] + reg['id']
                try:
                    sins_tmp = [r['text'] for r in reg['synonyms']]
                except:
                    sins_tmp = []
                obj_join_sinonimos[k_reg] = sins_tmp

                if 'subsenses' in reg:
                    for reg_sub in reg['subsenses']:
                        k_reg = pos + self.cfgs['separador'] + reg_sub['id']
                        try:
                            sins_tmp = [r['text'] for r in reg_sub['synonyms']]
                        except:
                            sins_tmp = []
                        obj_join_sinonimos[k_reg] = sins_tmp

        # Realizando juncao de sinonimos
        obj_join_sinonimos_tmp = {}

        for k_reg in obj_join_sinonimos:
            if k_reg in obj_join_definicoes:
                for k_reg_defs in obj_join_definicoes[k_reg]:
                    if len(obj_join_definicoes[k_reg]) == 1:
                        obj_join_sinonimos_tmp[
                            k_reg_defs] = obj_join_sinonimos[k_reg]
        for k_reg in obj_join_sinonimos:
            if k_reg in obj_join_definicoes:
                for k_reg_defs in obj_join_definicoes[k_reg]:
                    if not k_reg_defs in obj_join_sinonimos_tmp:
                        obj_join_sinonimos_tmp[
                            k_reg_defs] = obj_join_sinonimos[k_reg]

        for pos in obj_extrator:
            for def_prim in obj_extrator[pos]:
                if def_prim[:-1].lower() in obj_join_sinonimos_tmp:
                    chave = def_prim[:-1].lower()
                elif def_prim.lower() in obj_join_sinonimos_tmp:
                    chave = def_prim.lower()
                else:
                    chave = None

                if chave:
                    sins = obj_join_sinonimos_tmp[chave]
                    obj_unificado[pos][def_prim]['sinonimos'] = sins

                for def_sec in obj_extrator[pos][def_prim]['def_secs']:
                    if def_sec[:-1].lower() in obj_join_sinonimos_tmp:
                        chave = def_sec[:-1].lower()
                    elif def_sec.lower() in obj_join_sinonimos_tmp:
                        chave = def_sec.lower()
                    else:
                        chave = None

                    if chave:
                        sins = obj_join_sinonimos_tmp[chave]
                        obj_unificado[pos][def_prim]['def_secs'][def_sec][
                            'sinonimos'] = sins

        obj_join_sinonimos_tmp = None
        obj_join_definicoes = None
        obj_join_extrator = None
        obj_join_sinonimos = None
        obj_definicoes = None
        obj_sinonimos = None
        obj_extrator = None

        BaseOx.objs_unificados[palavra] = obj_unificado

        for pos_excluir in set(obj_unificado.keys()) - set(
                self.cfgs['oxford']['pos']):
            if pos_excluir in obj_unificado:
                del obj_unificado[pos_excluir]

        if obj_unificado == None or obj_unificado == {}:
            print("O objeto da palavra %s deu errado!" % palavra)

        return obj_unificado
Example #13
0
 def obter_antonimos(self, palavra):
     url = "%s/entries/en/%s/antonyms" % (self.url_base, palavra)
     return Util.requisicao_http(url, self.headers)
Example #14
0
 def persistir_urls_invalidas(self):
     Util.salvar_json(self.dir_urls_invalidas_sinonimos,
                      self.obj_urls_invalidas_sinonimos)
     Util.salvar_json(self.dir_urls_invalidas_definicoes,
                      self.obj_urls_invalidas_definicoes)
Example #15
0
    def obter_sins(self, palavra, definicao, pos=None, remover_sinonimos_replicados=False):
        obj_unificado = self.construir_objeto_unificado(palavra)

        if pos == None:
            lista_pos = [pos for pos in obj_unificado.keys()]
        elif len(pos) == 1:
            lista_pos = [Util.cvrsr_pos_wn_oxford(pos)]

        sinonimos_retorno = [ ]

        try:            
            for pos in lista_pos:
                for def_primaria in obj_unificado[pos]:
                    obj_filtrado = obj_unificado[pos][def_primaria]
                    if definicao in def_primaria or def_primaria in definicao:
                        sinonimos_retorno = obj_filtrado['sinonimos']
                    for def_sec in obj_unificado[pos][def_primaria]['def_secs']:
                        if definicao in def_sec or def_sec in definicao:
                            sinonimos_retorno = obj_filtrado['def_secs'][def_sec]['sinonimos']
                            # Se sinonimos de definicao mais aninhada é
                            # igual às definicoes mais externas, entao, retorne nada!
                            if sinonimos_retorno == obj_filtrado['sinonimos']:
                                if remover_sinonimos_replicados == True:
                                    return [ ]

            # Se sinonimos estao no objeto
            if sinonimos_retorno != [ ]:
                return sinonimos_retorno

            sinonimos_extraidos_definicao = [ ]

            if sinonimos_retorno != [ ]:
                if pos in ['Noun', 'n', 'Verb', 'v']:
                    sinonimos_extraidos_definicao = self.obter_sins_nv(palavra, definicao, pos=pos[0].lower())
                else:
                    sinonimos_extraidos_definicao = self.extrair_sins_cands_def(palavra, definicao, pos=pos[0].lower())
            
            sinonimos_extraidos_definicao = set(sinonimos_extraidos_definicao)-set(sinonimos_retorno)

            if sinonimos_retorno + list(sinonimos_extraidos_definicao) != [ ]:
                return sinonimos_retorno + list(sinonimos_extraidos_definicao)
            else:
                raise Exception("Erro na obtencao de sinonimos!")
        except Exception, e:
            sins_def = self.extrair_sins_cands_def(definicao, pos)
            sins_nouns = [ ]

            if pos in ['Adverb', 'Adjective', 'a', 'r']:
                if not palavra in sins_def: return [palavra] + sins_def
                else: return sins_def

            if pos in ['Noun', 'n', 'Verb', 'v']:
                retorno = self.obter_sins_nv(palavra, definicao, sins_def, pos=pos[0].lower())

                if retorno == [ ] and sins_def != [ ]:
                    for noun in sins_def:
                        for s in wn.synsets(palavra, 'n'):
                            for sh in s.hypernyms() + s.hyponyms() + s.similar_tos():                                
                                if noun in sh.lemma_names():
                                    if not noun in retorno:
                                        retorno.append(noun)

                if retorno:
                    if not palavra in retorno: return [palavra] + retorno
                    else: return retorno
                else:
                    if not palavra in sins_def: return [palavra] + sins_def
                    else: return sins_def
            else :
                if not palavra in sins_def: return [palavra] + sins_def
                else: return sins_def
Example #16
0
class DesOx(object):
    INSTANCE = None
    cache_objs_json = {}

    def __init__(self, cfgs, base_ox, rep_vetorial=None):
        self.cfgs = cfgs
        self.base_ox = base_ox
        self.rep_conceitos = None

        self.rep_vetorial = rep_vetorial

        self.usar_cache = True
        self.dir_cache = cfgs['oxford']['cache']['desambiguador']
        self.tam_max_ngram = 4

    def assinatura_significado_aux(self, lema, pos, definicao, lista_exemplos):
        retornar_valida = Util.retornar_valida_pra_indexar
        assinatura = retornar_valida(definicao.replace('.', '')).lower()
        assinatura = [
            p for p in Util.tokenize(assinatura) if not p in [',', ';', '.']
        ]
        if lista_exemplos:
            assinatura += list(
                itertools.chain(
                    *[retornar_valida(ex).split() for ex in lista_exemplos]))
        assinatura += lema
        assinatura = [p for p in assinatura if len(p) > 1]
        return assinatura

    # "lematizar,True::nbest,True::stop,True::ctx,frase.::pos,r::usar_ontologia,False::
    # stem,True::usar_exemplos,True::busca_ampla,False"
    def construir_chave_cache(self, vars):
        vars = [
            ",".join((unicode(k), unicode(v))) for k, v in vars.iteritems()
        ]
        return "::".join(vars)

    # Metodo Cosseno feito para o dicionario de Oxford
    # Retorna dados ordenados de forma decrescente
    def desambiguar(self, ctx, ambigua, pos, nbest=True,\
                    lematizar=True, stem=True, stop=True,\
                    usar_ontologia=False, usr_ex=False,\
                    busca_ampla=False, med_sim='cosine', cands=[ ]):

        # Para gerar chave do CACHE
        vars_locais = dict(locals())

        dir_cache_tmp = None
        dir_bases = self.cfgs['caminho_bases']

        self.usar_cache = False

        if self.usar_cache:
            obj_dir_cache_des = dir_bases + '/' + self.cfgs['oxford']['cache'][
                'desambiguador']

            del vars_locais['self']
            del vars_locais['ambigua']

            k_vars = self.construir_chave_cache(vars_locais)

            dir_completo_obj = "%s/%s.json" % (obj_dir_cache_des, ambigua)
            Util.abrir_json(dir_completo_obj, criarsenaoexiste=True)

            if k_vars in obj_cache:
                return obj_cache[k_vars]

        if len(pos) == 1:
            pos = Util.cvrsr_pos_wn_oxford(pos)

        lem, st = (med_sim == 'cosine'), (med_sim == 'cosine')

        todas_assinaturas = []

        try:
            todas_assinaturas = self.assinatura_significado(
                ambigua, usar_exemplos=usr_ex, lematizar=lem, stem=st)

            for candidato_iter in cands:
                todas_assinaturas += self.assinatura_significado(
                    candidato_iter,
                    usar_exemplos=usr_ex,
                    lematizar=lem,
                    stem=st)

            todas_assinaturas = [
                assi for assi in todas_assinaturas
                if pos == assi[0].split('.')[1]
            ]
            # Tirando palavras de tamanho 1
            ctx = [p for p in Util.tokenize(ctx.lower()) if len(p) > 1]
            ctx = Util.normalizar_ctx(ctx, stop=stop, lematizar=lem, stem=st)
        except KeyboardInterrupt, ke:
            pass

        pontuacao = []

        for assi in todas_assinaturas:
            ass_definicao = Util.normalizar_ctx(assi[3],
                                                stop=stop,
                                                lematizar=lematizar,
                                                stem=stem)

            label_def, desc_def, frase_def, ass_def = assi
            reg_def = (label_def, desc_def, frase_def)

            if med_sim == 'cosine':
                func_sim = cos_sim
            elif med_sim == 'word_move_distance':
                func_sim = self.rep_vetorial.word_move_distance

            dist_simi = func_sim(" ".join(ctx), " ".join(ass_definicao))

            # Colocando valor infinito
            if dist_simi == float('inf'):
                dist_simi = float(Util.MAX_WMD)

            if dist_simi == 'cosine' and dist_simi == 0.00:
                pass
            else:
                pontuacao.append((dist_simi, reg_def))

        # Ordenacao da saida do desambiguador (cosine=decrescente, wmd=crescente)
        ordem_crescente = (med_sim == 'cosine')
        res_des = [(s, p)
                   for p, s in sorted(pontuacao, reverse=ordem_crescente)]

        if self.usar_cache:
            obj_cache[k_vars] = res_des
            Util.salvar_json(dir_completo_obj, obj_cache)

        return res_des
Example #17
0
 def extrair_sins_cands_def(self, definicao, pos):
     return Util.extrair_sins_cands_def(definicao, pos)
    def iniciar_indexacao_signalmedia(dir_lista_arquivos, arquivos_duplicados):
        arquivos_duplicados = Util.abrir_json(arquivos_duplicados,
                                              criarsenaoexiste=False)
        arquivos_duplicados_set = set()

        for reg_str in arquivos_duplicados:
            path, _id_ = eval(reg_str)
            arquivos_duplicados_set.add(_id_)

        Whoosh.DIR_INDEXES = raw_input("Diretorio indexes: ")

        if not os.path.exists(Whoosh.DIR_INDEXES):
            os.mkdir(Whoosh.DIR_INDEXES)
            indexer = create_in(Whoosh.DIR_INDEXES, Whoosh.SCHEMA_CORPORA)
        else:
            indexer = whoosh.index.open_dir(Whoosh.DIR_INDEXES)

        writer = indexer.writer()

        arquivo_lista = open(dir_lista_arquivos, 'r')
        todos_arquivos = [
            e.replace('\n', '') for e in arquivo_lista.readlines()
        ]
        arquivo_lista.close()

        indice_arquivo = 1
        for _arquivo_ in todos_arquivos:
            if writer.is_closed:
                writer = None
                writer = indexer.writer()

            indice_linha = 1
            arquivo = "./Bases/Corpora/SignalMedia/" + _arquivo_

            print('\tArquivo %d' % (indice_arquivo))

            with open(arquivo) as _arq_:
                for linha_tmp in _arq_:
                    try:
                        obj_json = json.loads(linha_tmp)

                        if not obj_json["id"] in arquivos_duplicados_set:
                            titulo_doc_sm = obj_json["title"]

                            arq = obj_json["content"]

                            arq.replace(". \n\n", ". ")
                            arq.replace("? \n\n", "? ")
                            arq.replace("! \n\n", "! ")

                            arq.replace(". \n \n", ". ")
                            arq.replace("? \n \n", "? ")
                            arq.replace("! \n \n", "! ")

                            arq = re.split('[.?!]', arq)
                            arq = [l for l in arq if l.strip() != '']

                        else:
                            arq = []

                    except:
                        arq = []

                    for linha_arq in arq:
                        try:
                            #conteudo = unicode(str(linha_arq).decode('utf-8'))
                            #conteudo = re.sub(r'[^\x00-\x7F]+',' ', conteudo)
                            conteudo = str(linha_arq)
                            conteudo = "".join(
                                [i if ord(i) < 128 else " " for i in conteudo])

                            import random
                            nome_arquivo = arquivo + '-' + \
                                str(Util.md5sum_string(conteudo))

                            title = unicode(nome_arquivo)
                            path = unicode(nome_arquivo)
                            content = unicode(conteudo)

                            try:
                                if content.strip(" ") != "":
                                    if writer.is_closed:
                                        writer = indexer.writer()
                                        if writer.is_closed == False:
                                            raw_input("Deu certo!")
                                        else:
                                            raw_input("Deu errado!")

                                writer.add_document(title=title,
                                                    path=path,
                                                    content=content)
                            except Exception, e:
                                print("Content: " +
                                      str((content, title, path)))
                                import traceback
                                traceback.print_stack()
                                raw_input("\nExcecao aqui: %s\n" % str(e))

                        except Exception, e:
                            import traceback
                            traceback.print_stack()
                            print("\nException: " + str(e) + "\n")

                    #"""print('\tArquivo %d - Linha %d' % (indice_arquivo, indice_linha))"""
                        indice_linha += 1
            indice_arquivo += 1

            print('Realizando commit. Vai gastar um bom tempo!')
            try:
                if writer.is_closed:
                    raw_input("\nWriter estava fechado na hora do commit!\n")
                writer.commit()
                print("@@@ " + _arquivo_)
                print('Commit realizado...')
            except Exception, e:
                import traceback
                print("@@@ " + _arquivo_)
                print("\nException: " + str(e) + "\n")
                print('Commit NAO realizado...')
                traceback.print_stack()
                print("===============================")