I want to return the exact same words but I don’t know how to do it

Asked

Viewed 82 times

-3

I have a problem that when I try to return the words I intend it also returns the words that have a comma or any character.

For example,

"I have this phrase that serves, to serve and that serves[1] of serves."

And when I try to print it back

{'serve':(4,1)} and wanted you to return {'serve':(1,1)} because I don’t want the words with , and [1] and .

I have these four functions:

  • parsePalavras serves to count how many times the word appears in a . txt
  • the ler_words function is used to print the list with the words that are in a . txt
  • function parse lines prints the number of the line where the word is
  • the found function takes a file . txt and uses those words to check where they are in the other file
def analisarPalavras(nomeficheiro,string):
    with open(nomeficheiro,'r') as f:
        quantas = 0
        for linha in f:
            if string in linha:
                quantas = quantas + 1
        return quantas
    
def ler_palavras(nomeficheiro):
    with open(nomeficheiro,'r') as f:
        listaFinal = []
        listaIndividual = [linha.split() for linha in f]
        listaJunta = sum(listaIndividual,[])
        for i in listaJunta:
            if i not in listaFinal:
                listaFinal.append(i)
        return listaFinal

def analisarLinhas(nomeficheiro,palavra):
    linhaNumero = 0
    listaResultado = []
    with open(nomeficheiro,'r') as f:
        for linha in f:
            linhaNumero = linhaNumero + 1
            if palavra in linha:
                listaResultado.append(linhaNumero)
    return listaResultado


def encontra_ocorrencias(nomeficheiro1,nomeficheiro2):
    with open (nomeficheiro1,'r') as textoAnalisar, open(nomeficheiro2,'r') as palavrasInteresse:
        palavrasLidas = ler_palavras(nomeficheiro2)
        dicionario = {}
        for i in range(len(palavrasLidas)):
            palavraImprimir = (palavrasLidas[i])
            palavraLinha = (analisarPalavras(nomeficheiro1,palavraImprimir))
            numeroLinhas = (analisarLinhas(nomeficheiro1,palavraImprimir))
            dicionario.update({palavraImprimir: (palavraLinha,numeroLinhas)})
        return dicionario

1 answer

-1

Assuming that the words in the text file to be analyzed will be separated by spaces, any other scorer should be included along with the words and the search will be insensitive to the letter box, the approach used in the question is not appropriate to the proposed problem, because every search for information about the file needs to reopen and compute the data. What seems to be very inefficient and led me to discard the original code taking only the requirements.

A better approach would be to open the file once and get in a single pass all the data you need to work already structured, tabulated in dictionaries nested and ready to be consulted. According to the structure:

<dicionário_externo> ::= {
  palavra 1 : dicionário_interno,
  palavra 2 : dicionário_interno,
          .
          .
          .
  palavra N : dicionário_interno
}

<dicionário_interno> ::= {
                      linha 1: colunas 
                      linha 2: colunas 
                            .
                            .
                            .
                      linha N: colunas 
                     }

 <colunas> ::= [coluna 1, coluna 2,.....,coluna N]

Where:

  • palavra 1...palavra N are the external dictionary keys which in turn are the literal transcription of each word found in the text file.
  • every key palavra 1...palavra N is assigned a value that is also a dictionary the internal dictionary_dictionary.
  • linha 1...linha N are the internal dictionary keys which in turn are the literal transcription of the line number where the word was found.
  • every key linha 1...linha N is assigned a value that is a list where coluna 1,...,coluna N are the column numbers within the row where the word was found.

The program defines a function tabulartexto(arquivo) which accepts a file name as input and performs the following steps:

  • Arbre filing cabinet.
  • Reads filing cabinet for a string in memory.
  • Closes the filing cabinet.
  • Breaks the string into lines with the help of the function str.splitlines().
  • For each line the word match breaks, involved by the object Match, with the help of the function re.finditer().
  • For each match is tabulated their respective data of interest.

So

import re

#Extrai uma tabela de informações de arquivo texto.
def tabulartexto(arquivo):
  tab = {}                                       #Tabela onde serão montados os dados.

  #Abre, lê o arquivo e salva seu conteúdo na memória dinâmica.
  with open(arquivo,'r') as f:
    s = f.read()

  #Quebra o arquivo em linhas e as enumera...
  for le in enumerate(s.lower().splitlines(True), 1):
    linha = le[0]                                 #...o numero da linha atual(facilitar a leitura).
    #...quebra a linha atual em correspondências de palavras e para cada uma delas...
    for m in re.finditer(r'(\S+)', le[1]):
      palavra = m.group(0)                        #...pega o texto da palavra.
      coluna = m.start(0) + 1                     #...pega a posição da coluna onde a palavra se inicia dentro de sua linha.
      #...verifica se a palavra já foi catalogada... 
      if palavra in tab:
        #...verifica se a linha contendo a palavra já foi catalogada...
        if linha in tab[palavra]:
          tab[palavra][linha].append(coluna)       #...adiciona a linha a posição da coluna onde a palavra se inicia.
        else:
          tab[palavra][linha] = [coluna]           #...cataloga a linha e a inicializa com o valor coluna onde a palavra se inicia.
      else:
        tab[palavra] = {linha : [coluna]}          #...cataloga a palavra e inicializa  linha com o valor coluna onde a palavra se inicia.
  return tab                                       #Retorna os dados tabulados.

#Conta quantas vezes a palavra aparece.
def analisarPalavras(palavra, tabela):
  p = palavra.lower()   
  return sum(map(len, tabela[p].values())) if p in tabela else 0;

#Retorna lista com as palavras que se encontram num arquivo.
def lerPalavras(tabela):
  return sorted(tabela.keys())

#Quantidade de ocorrências e os números das linhas da palavra.
def analisarLinhas(palavra, tabela):
  p = palavra.lower()   
  if p not in tabela:
    return None
  return [(len(tabela[p][l]), l) for l in tabela[p]]

#Cruzamento das ocorrências das palavras em dois arquivos.
def encontra_ocorrencias(tabela1, tabela2):
  return tabela1.keys() & tabela2.keys()

See this example in use on Repl.it

  • Could you explain why I voted no so that I can improve the answer?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.