def predicao_usual(frase, palavra, pos, fonte='oxford'):
        conjunto = []

        if fonte == 'oxford':
            inst = BaseOx.INSTANCE

            for d in BaseOx.obter_definicoes(inst, palavra, pos):
                for s in BaseOx.obter_sins(inst, palavra, d, pos):
                    if s != palavra:
                        conjunto.append(s)

        elif fonte == 'wordnet':
            for s in wn.synsets(palavra, pos):
                for l in s.lemma_names():
                    if palavra != l:
                        if Util.e_mpalavra(l):
                            conjunto.append(l)

        return [p for p in conjunto if Util.e_mpalavra(p) == False]
Пример #2
0
    def __init__(self, configs):
        self.configs = configs
        # self.configs['dir_base_casada_manualmente']
        self.diretorio_base_casada_manualmente = self.configs[
            'dir_base_casada_manualmente']
        self.base_casada_manualmente = Util.abrir_json(
            self.diretorio_base_casada_manualmente)
        self.base_ox = BaseOx(self.configs)

        if self.base_casada_manualmente == None:
            self.base_casada_manualmente = {}
    def indexar_definicoes_palavra_ox(palavra):
        from OxAPI import BaseOx

        documentos = []
        numero = 1

        for d, pos in BaseOx.obter_definicoes(BaseOx.INSTANCE,
                                              palavra,
                                              retornar_pos=True):
            exemplos = BaseOx.obter_atributo(BaseOx.INSTANCE, palavra, None, d,
                                             'exemplos')
            exemplos = ":::".join(exemplos)

            path = '%s-%s.json-%d' % (palavra, pos[0].lower(), numero)
            reg = (palavra + ":::" + d, path, exemplos)
            documentos.append(reg)

            numero += 1

        Whoosh.iniciar_indexacao_exemplos(documentos)
        return documentos
Пример #4
0
    def iniciar_casamento(self, termo, pos, corrigir=False):
        if corrigir:
            del self.base_casada_manualmente[termo]

        if not termo in self.base_casada_manualmente:
            self.base_casada_manualmente[termo] = {}

        if not wn.synsets(
                unicode(termo),
                pos)[0].name() in self.base_casada_manualmente[termo]:
            obj_oxford = BaseOx.construir_objeto_unificado(termo)
            pos_oxford = Util.cvrsr_pos_wn_oxford(pos)

            try:
                obj_oxford = obj_oxford[pos_oxford]
            except TypeError:
                print('A POS %s para o termo %s nao foi encontrada!' %
                      (pos_oxford, termo))
                return

            for synset in wn.synsets(unicode(termo), pos):
                self.base_casada_manualmente[termo][synset.name()] = []

                print('\n\n')
                print('\t' + str((str(termo), str(pos))))
                print('\t' + synset.definition().upper() + '\n')

                indice = 1
                definicoes_indexadas = []
                for definicao in obj_oxford:
                    definicoes_indexadas.append(definicao)
                    print('\n\t\t' + str(indice) + ' - ' + repr(definicao) +
                          '\n')
                    indice += 1
                    for def_sec_iter in obj_oxford[definicao]['def_secs']:
                        def_sec = def_sec_iter.encode('utf8')
                        definicoes_indexadas.append(def_sec)
                        print('\t\t' + str(indice) + ' - ' + repr(def_sec))
                        indice += 1

                valores = self.ler_inteiros('\n\tINDICES: ')
                print('\tAnotacao > ' + str(valores))
                print('\n\n')

                for v in valores:
                    try:
                        self.base_casada_manualmente[termo][
                            synset.name()].append(definicoes_indexadas[v - 1])
                    except IndexError:
                        pass

            dir_saida = self.diretorio_base_casada_manualmente
            Util.salvar_json(dir_saida, self.base_casada_manualmente)
Пример #5
0
    def bow_embbedings_definicao(palavra, pos):
        from OxAPI import BaseOx
        from Alvaro import Alvaro

        descricao_definicoes = {}
        uniao_definicoes = set()

        for d in BaseOx.obter_definicoes(BaseOx.INSTANCE, palavra, pos=pos):
            d_sins = BaseOx.obter_sins(BaseOx.INSTANCE, palavra, d, pos=pos)

            correlatas = []
            for s in d_sins:
                similares_tmp = [
                    reg[0] for reg in Alvaro.palavras_similares(s, pos)
                ]
                uniao_definicoes.update(similares_tmp)
                correlatas.append(similares_tmp)

            # Interseccao entre palavras da mesma definicao
            interseccao = set(correlatas[0])
            for c in correlatas[:1]:
                interseccao = set(interseccao) & set(c)

            descricao_definicoes[d] = interseccao

        #for d in descricao_definicoes:
        #    descricao_definicoes[d] = list(set(descricao_definicoes[d]) - set(uniao_definicoes))
        descricao_definicoes_tmp = {}
        for d in descricao_definicoes:
            uniao_outros = set()
            for outro in descricao_definicoes:
                if outro != d: uniao_outros.update(descricao_definicoes[outro])
            descricao_definicoes_tmp[d] = set(
                descricao_definicoes[d]) - uniao_outros
            descricao_definicoes_tmp[d] = list(descricao_definicoes_tmp[d])
            uniao_outros = None

        return descricao_definicoes_tmp
Пример #6
0
    def recuperar_exemplos(self, nome_synset=""):
        termo = wn.synset(nome_synset).lemma_names()[0]
        pos_oxford = wn.synset(nome_synset).pos()
        pos_oxford = Util.cvrsr_pos_wn_oxford(pos_oxford)

        try:
            obj_unificado = BaseOx.construir_objeto_unificado(
                termo)[pos_oxford]
        except:
            print('Excecao: ' + str((termo, pos_oxford)))
            obj_unificado = None

        try:
            definicoes_oxford = self.base_casada_manualmente[termo][
                nome_synset]
        except:
            print(
                'Excecao! Nao foram encontradas definicoes para o (%s, %s) na base casada manualmente!'
                % (termo, nome_synset))
            definicoes_oxford = None

        if definicoes_oxford:
            lista_definicoes = []

            for def_principal in obj_unificado:
                reg = ("", def_principal,
                       obj_unificado[def_principal]['exemplos'])
                lista_definicoes.append(reg)
                for def_sec in obj_unificado[def_principal]['def_secs']:
                    reg = ("", def_sec, obj_unificado[def_principal]
                           ['def_secs'][def_sec]['exemplos'])
                    lista_definicoes.append(reg)

            for nome_def, definicao, exemplos in lista_definicoes:
                if definicao in definicoes_oxford:
                    return exemplos

        return []
    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
Пример #8
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]
Пример #9
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
Пример #10
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
Пример #11
0
            exemplos_blob = []

            palavras_tf = {}

            try:
                maximo_exemplos = self.cfgs['params_exps']['qtde_exemplos'][0]

                lista_exemplos = []
                definicoes_caminho = [
                    tuple(r.split(":::")) for r in reg_caminhos.split("/")
                ]

                # Percorrendo todos caminhos nas arvores de sinonimos
                for lema_caminho, def_caminho in definicoes_caminho:
                    try:  # Adicionando caminho
                        novos_ex = BaseOx.obter_atributo(BaseOx.INSTANCE,\
                                        lema_caminho, pos, def_caminho, 'exemplos')
                        novos_ex = list(novos_ex)
                        lista_exemplos += novos_ex
                    except:
                        lista_exemplos = []

                    # Adicionando lemas
                    sins_defcaminho = BaseOx.obter_sins(
                        BaseOx.INSTANCE, lema_caminho, def_caminho, pos)

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

                    # Adicionando definicao
                    lista_exemplos.append(def_caminho)