Me gustaría contar la cantidad de palabras específicas (conjunciones: "también", "aunque", "y", "como", "porque", "antes", "pero", "para", "si" , "ni", "de", "o", "desde", "eso", "aunque", "hasta", "cuándo", "siempre que", "mientras que", "que", "mientras", " todavía ") y también la puntuación de un archivo txt

Esto es lo que he hecho:

def count(fname, words_list):
if fname:
    try:
        file = open(str(fname), 'r')
        full_text = file.readlines()
        file.close()
        count_result = dict()
        for word in words_list:
            for text in full_text:
                if word in count_result:
                    count_result[word] = count_result[word] + text.count(word)
                else:
                    count_result[word] = text.count(word)
        return count_result
    except:
        print('Something really bad just happened!')

print(count('sample2.txt', ["also", "although", "and", "as", "because", "before", "but", "for", "if", "nor", "of",
"or", "since", "that", "though", "until", "when", "whenever", "whereas",
"which", "while", "yet", ",", ";", "-", "'"]))

Pero lo que hace es que cuenta "estaba" en "como", ¿cómo lo soluciono o hay otras formas de archivar esto? Gracias

La salida esperada es algo como:

{'también': 0, 'aunque': 0, 'y': 27, 'como': 2, 'porque': 0, 'antes': 2, 'pero': 4, 'para': 2, ' si ': 2,' ni ': 0,' de ': 13' o ': 2', 'desde': 0, 'que': 10, 'aunque': 2, 'hasta': 0, 'cuando' : 3, 'siempre que': 0, 'mientras que': 0, 'que': 0, 'mientras que': 0, 'todavía': 0, ',': 41, ';': 3, '-': 1 , "'": 17,' palabras_por_sentencia ': 25.4286,' oraciones_por_par ': 1.75}

0
Nathan Chan 4 oct. 2019 a las 13:01

4 respuestas

La mejor respuesta
def word_count(fname, word_list):
    count_w = dict()
    for w in word_list:
        count_w[w] = 0

    with open(fname) as input_text:
        text = input_text.read()
        words = text.lower().split()
        for word in words:
            _word = word.strip('.,:-)()')
            if _word in count_w:
                count_w[_word] +=1

    return count_w

def punctaction_count(fname, punctaction):
    count_p = dict()
    for p in punctaction:
        count_p[p] = 0
    with open(fname) as input_text:
        for c in input_text.read():
            if c in punctaction:
                count_p[c] +=1
    return count_p




print(word_count('c_prog.txt', ["also", "although", "and", "as", "because", "before", "but", "for", "if", "nor", "of", "or", "since", "that",
                                "though", "until", "when", "whenever", "whereas", "which", "while", "yet"]))

print(punctaction_count('c_prog.txt', [",", ";", "-", "'"]))

Si quieres hacer esto en una función:

def word_count(fname, word_list, punctaction):
    count_w = dict()
    for w in word_list:
        count_w[w] = 0

    count_p = dict()
    for p in punctaction:
        count_p[p] = 0

    with open(fname) as input_text:
        text = input_text.read()
        words = text.lower().split()
        for word in words:
            _word = word.strip('.,:-)()')
            if _word in count_w:
                count_w[_word] +=1

        for c in text:
            if c in punctaction:
                count_p[c] +=1

    count_w.update(count_p)
    return count_w




print(word_count('c_prog.txt', ["also", "although", "and", "as", "because", "before", "but", "for", "if", "nor", "of", "or", "since", "that",
                                "though", "until", "when", "whenever", "whereas", "which", "while", "yet"], [",", ";", "-", "'"]))
0
AngrySoft 5 oct. 2019 a las 16:52

Haría algo más simple como revisar las palabras en su archivo y verificar si cada una de ellas está en la lista de las palabras que desea contar. En ese caso, agregue 1 al diccionario de contador en la entrada de esa palabra.

    # get all the words in the file
    word_list_in_text = file.read().split()
        count_result={}
        for word in words_list_in_text:
            #check if each word in the file is in your target list
            if word is in word_list:
                if word not in count_result:
                    count_result[word] = 1
                else:
                    count_result[word] += 1
    print(count_result)
0
JacoSolari 4 oct. 2019 a las 10:23

La función str.count (sub) cuenta las subcadenas sub. Cuando desea que cuente "como", lo encuentra en la palabra "era" y luego incrementa el número de "como" se encuentra.

Puede usar regex aquí, para especificar que desea "como" como una palabra completa, no como una subcadena de otra palabra. La bandera \ b indica el final de una palabra.

0
Rowin 4 oct. 2019 a las 10:18

En 2.7 y 3.1 hay un Contador especial para lo que usted dice estás tratando de lograr

Como no ha publicado ningún resultado de muestra. Me gustaría darle un enfoque que pueda usar. Mantener una lista. Agregue estas palabras que necesita en la lista. Por ejemplo, si se acerca a la palabra "también", agréguela en la lista.

>>> l.append("also")
>>> l
['also']

Del mismo modo, se encuentra con la palabra "aunque", la lista se convierte en:

>>> l.append("although")
>>> l
['also', 'although']

Si vuelve a encontrar "también", añádalo nuevamente a la lista como se indica arriba.

La lista se convierte en:

['also', 'although', 'also']

Ahora use Counter para contar el número de ocurrencias de elementos de la lista:

>>> l = ['also', 'although', 'also']
>>> result = Counter(l)
>>> l
['also', 'although', 'also']
>>> result
Counter({'also': 2, 'although': 1})
1
Bolshoi Booze 4 oct. 2019 a las 10:16
58234175