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]
    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
Beispiel #3
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
    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
Beispiel #5
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