I need to find a string in a text file (here a dictionary).
The string found in the file must be exactly the same as the one I am comparing.
Here is my code and the dictionary:
the code
#!/usr/bin/env python3
import os # pour ouvrir le dictionnaire
def check_if_exist(word,dico):
"""retourne vrai si le mot exsite dans le dictionnaire"""
for line in dico:
#line = line.rstrip('\n')
# on ne peut pas utiliser in pour la condition
# car in fait une comparaison partielle, exemple :
# "pal" in "empaler" ; return True
if word.rstrip('\n') == line.rstrip('\n'):
return True
return False
if __name__ == "__main__":
#file_path = "./dico-french.txt"
file_path = "./dico.txt"
# teste si le fichier existe
if(not os.path.isfile(file_path)):
print("le dictionnaire n'existe pas")
exit(1)
#ouvre le dictionnaire
dico = open(file_path,'r')
print("q pour quitter le jeu.")
mot = input("Premier joueur, quel est votre mot ? ")
# tant que le mot n'existe pas
while(not check_if_exist(mot,dico)):
mot = input("Un autre ? ")
# le mot existe, on passe au joueur suivant
tab = []
tab.append(mot)
mot_old = mot
while mot!='q':
print("\nles mots sont ",tab)
mot = input("Joueur suivant, quel est votre mot ? ")
while(not check_if_exist(mot,dico)):
mot = input("Un autre bis ? ")
tab.append(mot)
mot_old = mot
print("Bye.")
the dict
pal
lape
pale
palie
pallier
pallies
Let me explain you the problem with these examples :
for the fig n°1, the conditions seems to be met, all the words are in the dictionary.
fig n°1:
q pour quitter le jeu.
Premier joueur, quel est votre mot ? pal
les mots sont ['pal']
Joueur suivant, quel est votre mot ? pale
les mots sont ['pal', 'pale']
Joueur suivant, quel est votre mot ? palie
les mots sont ['pal', 'pale', 'palie']
Joueur suivant, quel est votre mot ? ^C
for the fig n°2, all the word are in the dictionary, but when I enter a word positioned after the one I am comparing in the dictionary, it does not find it
fig n°2:
q pour quitter le jeu.
Premier joueur, quel est votre mot ? palie
les mots sont ['palie']
Joueur suivant, quel est votre mot ? pal
Un autre bis ? ^C
There is some kind of index that doesn't reset while I leave the function.
On the fig n°3 I try with a word not in the dictionary, this unknown word is not found, so it ask me for another word, and when I enter a known-word it doesn't work.
fig n°3:
q pour quitter le jeu.
Premier joueur, quel est votre mot ? pal
les mots sont ['pal']
Joueur suivant, quel est votre mot ? hgjfdkjhgfj
Un autre bis ? pale
Un autre bis ? ^C
Can someone explain this to me?
EDIT:
Thanks to 'Nir H.', just have to add dico.seek(0) at the beginning of my function
Related
This the function I used But it does not take into consideration the case when the last sentences does not have punctuation mark.
texte = [ "Là où les vêtements de sport connectés actuels sont axés sur la performance des sportifs, ici, on aura l'occasion pour des amateurs de se rassurer que les mouvements que nous effectuons sont justes. Cela nous évitera bien des mauvaises surprises (douleurs et autres...) au lendemain d'une activité.","Par ailleurs, ce serais bien que l'application ne fonctionne pas uniquement avec les capteurs dans les vêtements, car on ne peut pas les porter tous les jours surtout s'il s'apparente à des vêtements de sport. Ainsi, il serait intéressant que l'application puisse quand même donner des conseils et astuces personnalisés sur nos postures même en dehors des activités sportives avec par exemple des conseils pour les personnes qui travaillent devant un écran toute la journée, ou encore pour ceux qui sont souvent en déplacement en voiture... Etc.", "Le système a l air bien mais cela consiste à avoir des bobines de fils spécial et il y a l air d y avoir beaucoup de petites pièce à sortir pour changer les bobines se qui risque d en perdre! Et je pense que si on met un exemple comme au début de la vidéo avec les 3 fils attachée à une gaine et que l on tir à l autre bout là malette sera trop légère et elle avancera et bloquera les fils ", " A voir les matériaux utilisés pour un prix plus précis"]
alphabet = "([a-z][...])"
alphabets= "([A-Za-z])"
min = "([...][a-z])"
maj = "([...][A-Z])"
punc = "([,':>><<)][A-Z])"
prefixes = "(Mr|St|Mrs|Ms|Dr)[.]"
suffixes = "(Inc|Ltd|Jr|Sr|Co)[.]"
starters = "(M|Mr|Mme|Sr|Dr)"
acronyms = "([A-Z][.][A-Z][.](?:[A-Z][.])?)"
websites = "[.](com|net|org|io|gov)"
digits = "([0-9])"
punct= "([!|)|?|,][<<|>>])"
def split_into_sentences(text):
#text = normalize(text)
text = " " + text + " "
text = text.replace("\n"," ")
text = re.sub(prefixes,"\\1<prd>",text)
text = re.sub(websites,"<prd>\\1",text)
if "Ph.D" in text: text = text.replace("Ph.D.","Ph<prd>D<prd>")
text = re.sub("\s" + alphabets + "[.] "," \\1<prd> ",text)
text = re.sub(acronyms+" "+starters,"\\1<stop> \\2",text)
text = re.sub(alphabets + "[.]" + alphabets + "[.]" + alphabets + "[.]","\\1<prd>\\2<prd>\\3<prd>",text)
text = re.sub(alphabets + "[.]" + alphabets + "[.]","\\1<prd>\\2<prd>",text)
text = re.sub(" "+suffixes+"[.] "+starters," \\1<stop> \\2",text)
text = re.sub(" "+suffixes+"[.]"," \\1<prd>",text)
text = re.sub(" " + alphabets + "[.]"," \\1<prd>",text)
text = re.sub(digits + "[.]" + digits,"\\1<prd>\\2",text)
text = re.sub(digits + "[.]" + digits,"\\1<prd>\\2",text)
text = re.sub(min,"\\1<prd>",text)
text = re.sub(maj,"\\1<stop>",text)
text = re.sub(punc,"\\1<prd>",text)
if "e.g." in text: text = text.replace("e.g.","e<prd>g<prd>")
if "i.e." in text: text = text.replace("i.e.","i<prd>e<prd>")
if "etc.)" in text: text = text.replace("etc.","etc<prd>)")
#if "Etc." in text: text = text.replace("Etc.","Etc<prd>")
if "...]" in text: text = text.replace("...]","<prd><prd><prd>]")
if "...]" in text: text = text.replace("...]","<prd><prd><prd>]")
if "...)'" in text: text = text.replace("...)","<prd><prd><prd>)")
if "?»." in text: text = text.replace("?».","<prd><prd>.")
if "!»." in text: text = text.replace("!».","<prd><prd>.")
if "]»." in text: text = text.replace("]».","<prd><prd>.")
#if "...." in text: text = text.replace("....","<prd><prd><prd><prd>")
if "..." in text: text = text.replace("...","<prd><prd><prd>")
if ".." in text: text = text.replace("..","<prd><prd>")
if "”" in text: text = text.replace(".”","”.")
if "\"" in text: text = text.replace(".\"","\".")
if "!" in text: text = text.replace("!\"","\"!")
if "?" in text: text = text.replace("?\"","\"?")
text = text.replace(".",".<stop>")
text = text.replace("?","?<stop>")
text = text.replace("!","!<stop>")
text = text.replace("...","...<stop>")
text = text.replace("<prd>",".")
# text = text.replace("....","....<stop>") #text = text.replace("…","…<stop>")
sentences = text.split("<stop>")
sentences = sentences[:-1]
sentences = [s.strip() for s in sentences]
#print(sentences)
return sentences
list_clean_text = []
length_token = []
length_Berttoken = []
length_sent = []
list_sent =[]
list_clean = []
print(type(texte))
for i, elt in enumerate(texte):
#print(i, "--", elt)
# split sentences and append len for each
split_sent = split_into_sentences(elt)
print(type(split_sent))
if split_sent == []:
print("List is empty")
list_sent.append(elt)
nb = 1
length_sent.append(nb)
else:
list_sent.append(split_sent)
length_sent.append(len(split_sent))
The above function function work well but it does not take into consideration when a string does not have punctuation or when the last sentence of a string does not have punction. It ignores and just return the sentences where the end was a punctuation.
It's easier with nltk as suggested by #TimBiegeleisen. However, you have to prepare the framework first:
# Python env: pip install nltk
# Anaconda env: conda install nltk
from nltk.tokenize import sent_tokenize
nltk.download('punkt')
tokenizer = nltk.data.load('tokenizers/punkt/french.pickle')
out = tokenizer.tokenize_sents(texte))
Output:
>>> out
[["Là où les vêtements de sport connectés actuels sont axés sur la performance des sportifs, ici, on aura l'occasion pour des amateurs de se rassurer que les mouvements que nous effectuons sont justes.",
"Cela nous évitera bien des mauvaises surprises (douleurs et autres...) au lendemain d'une activité."],
["Par ailleurs, ce serais bien que l'application ne fonctionne pas uniquement avec les capteurs dans les vêtements, car on ne peut pas les porter tous les jours surtout s'il s'apparente à des vêtements de sport.",
"Ainsi, il serait intéressant que l'application puisse quand même donner des conseils et astuces personnalisés sur nos postures même en dehors des activités sportives avec par exemple des conseils pour les personnes qui travaillent devant un écran toute la journée, ou encore pour ceux qui sont souvent en déplacement en voiture...",
'Etc.'],
['Le système a l air bien mais cela consiste à avoir des bobines de fils spécial et il y a l air d y avoir beaucoup de petites pièce à sortir pour changer les bobines se qui risque d en perdre!',
'Et je pense que si on met un exemple comme au début de la vidéo avec les 3 fils attachée à une gaine et que l on tir à l autre bout là malette sera trop légère et elle avancera et bloquera les fils'],
[' A voir les matériaux utilisés pour un prix plus précis']]
Where you set you sentence here:
sentences = text.split("<stop>")
There is no stop case for non-punctuation as you mentioned.
Perhaps a check for stop in the sentence first else fallback to the whole sentence.
in oneline:
sentences = text.split("<stop>") if "<stop>" in text else [text]
I insert token at the end of each sentence but they are case when the re is not that token what I would like to do is to retrieve the sentence after the last special token if there exist.
text = ["j’imagine une fourchette entre 40 et 65€ , prix auquel je l’achèterai sans doute.<stop> Au vu de la double fonction (2x25€) , de la technicité et de l’ingéniosité je pense que cela serait un prix très correct .<stop> A voir les matériaux utilisés pour un prix plus précis", "ma seule interrogation est « où seront commercialisées les bobines de fils"]
if "<stop>" in text:
print(text)
x =re.search("/[^<stop>]*$/",text)
print(x)
sentences = text.split("<stop>")
else:
print(text)
sentences = text
sentences = sentences[:-1]
sentences = [s.strip() for s in sentences]
I tried this but does not work. Give me None.
You can remove the re.seach part and append the last part of the split to the array. But note that that you have to loop the initial list.
You can add if s at the end of list comprehension to remove empty entries from the list.
text = [
"j’imagine une fourchette entre 40 et 65€ , prix auquel je l’achèterai sans doute.<stop> Au vu de la double fonction (2x25€) , de la technicité et de l’ingéniosité je pense que cela serait un prix très correct .<stop> A voir les matériaux utilisés pour un prix plus précis",
"ma seule interrogation est « où seront commercialisées les bobines de fils", "<stop>"]
sentences = []
for s in text:
sentences.append(s.split("<stop>")[-1])
sentences = [s.strip() for s in sentences if s]
print(sentences)
Output
['A voir les matériaux utilisés pour un prix plus précis',
'ma seule interrogation est « où seront commercialisées les bobines de fils']
I have a tsv file with two columns seperate by tabulation. The first column is the colum of sentences and the second the column of label I want to count the number of sentences which are positive, negative or neutral in the file sa I read it and loop inside it. I come up with this small code but It does not work ? How can I improve it ?
tsv = ['jdmfreins', 'jdmconditions', 'jdmne', 'jdmmotivations']
for s in tsv:
c_pos = 0
c_neu = 0
c_neg = 0
path = os.path.join(fileDir, '/mnt/c/Users/Emmanuelle/Documents/Extraction_corpus/fichier_sorti_tsv', s + '.tsv')
with open(path, 'r', encoding='utf-8') as l_1:
next(l_1)
print(s, '\n ')
l_1 = [line.rstrip() for line in l_1]
for line in l_1:
print(line)
if line.strip().endswith('positif'):
c_pos =+ 1
elif line.strip().endswith('neutre'):
c_neu =+ 1
else:
c_neg =+ 1
print('nombre positif :', c_pos)
print('nombre négatif :', c_neg)
print('nombre neutre :', c_neu, '\n')
The file look like this :
"""""""J'avais adoré les deux premières, mais celui-ci n'est pas du tout à la hauteur.""" positif
Peter Criss et Ace Frehley trouvent davantage leur place dans le travail de composition et au chant (Hooligan / Shock Me) face à l'omniprésence de la paire Stanley/Simmons mais les tensions internes existent et conduiront aux 4 albums solos de 1978... positif
Le contexte est certes bien rendu, mais les rapports entre les héros sont exécrables. positif
Le sujet aurait pu faire un bon vaudeville avec un tant soit peu d'humour et de finesse, mais, la plus belle femme du monde ne peut donner que ce qu'elle a !!! positif
arnold est mauvais, il fait des blagues pas marrantes le mechant est simplement le meme que dans le 2 mais en plus balezes, nick stahl est mauvais : pour finir c'est pitoyable de voir ce que peut faire hollywood pour du fric! neutre
Oui mais... Excusez moi mais même si les sketch me font rire séparément, essayer de tous les avaler en une soirée, c'est comme essayer de manger des kilos de foie gras en un repas. neutre
Au risque de ne pas brosser la majorité dans le sens du poil, je vais donner un avis honnête, qui n'engage que moi mais qui est tellement différent de ceux que j'avais pu lire qu'il peut être utile à certains. positif
(oubliez les compils recentes qui n'ont de compils que le nom,mais n'ont pas oublié au passage le coté biseness négatif
Début long avant d'etre pris par un peu de suspens devant un personnage que l'on pense interessant ( psychothérapeute tueur !)mais elle nous amène vers d'autres personnages s'étendant sur leur séjour, leur rencontre que l'on s'imagine utile pour la fin mais il n'en est rien!! neutre
La charge est un peu cruelle, mais l’unicité du style des DA de Miyasaki finit par me lasser. positif
Bon et bien le premier n'était déjas pas une révélation du cinéma mais là on frise le délit d'abut de confience. positif
Peut être suis-je excessif dans mes propos, mais je crois qu'ils sont à la mesure de ma déception. positif
"""presque cristalline chante pour 2 minutes de Bonheur auditif après tant de déception: Pourquoi ne se lancerait elle pas plutôt dans l'opéra et le répertoire classique revisité???ses nouvelles fréquentations lui font probablement du bien au cœur mais feraient mieux de changer de métier et arrêter de pervertir son talent si mal exploité""""""" neutre
and the answer :
nombre positif : 0
nombre négatif : 0
nombre neutre : 1
I tried also : if line.split('\t') == 'positif': but same answer
You can use Counter from the collections module:
from collections import Counter
with open('file.txt','r') as f:
lines = f.read().splitlines()
count = Counter([l.split()[-1] for l in lines])
print(count)
Output:
Counter({'positif': 8, 'neutre': 4, 'négatif': 1})
If you want the results in a dictionary:
print(dict(count))
Output:
{'positif': 8, 'neutre': 4, 'négatif': 1}
Breaking it down. This part:
with open('file.txt','r') as f:
lines = f.read().splitlines()
will assign all the lines in file.txt to a list called lines. The newlines have already been taken care of by the read().splitlines(). This part:
[l.split()[-1] for l in lines]
is a list comprehension that will list all the last words from the lines in lines, where str.split() will return a list of strings that have been separated by a space, and [-1] means the last element of the list.
I'm having a particular problem with my code (see below). Mainly, I want my function to return dictionary such that keys are in the ascending order and corresponding values are in the alphabetical order and I want values with the same key to be retired as a list: [{key1: [value1, value2, etc.], key2: [value1, value2, etc.], etc.}, ...], where key1 < key2 < key3 < ...
With my code I am getting:
[(1, {'s', 'c', 'n', 'à', 'd', 'a', 'l'}), (2, {'et', 'si', 'se', 'là', 'la', 'un', 'il', 'le', 'en', 'du', 'de', 'sa', 'ce'}), (3, {'ses', 'qui', 'ils', etc.} ...]
Could someone help me to modify my code?
def words_by_length(fileName):
dict_wl = {}
with open(fileName, 'r') as f:
for line in f:
tmp_str = line.lower().replace("?", " ").replace("'", " ").replace(".", " ").replace(",", " ")\
.replace("-", " ").split()
for word in tmp_str:
words = len(word)
if word.isalpha() and words in dict_wl:
dict_wl[words].add(word)
else:
dict_wl[words] = {word}
# print(dict_wl)
s_dict_wl = sorted(dict_wl.items())
return s_dict_wl
I'm using the following text (which I have saved as file) to test the code:
Et, sous ses pieds, les coups profonds, les coups obstinés des rivelaines continuaient. Les camarades étaient tous là, il les entendait le suivre à chaque enjambée. N'était-ce pas la Maheude, sous cette pièce de betteraves, l'échine cassée, dont le souffle montait si rauque, accompagné par le ronflement du ventilateur ? A gauche, à droite, plus loin, il croyait en reconnaître d'autres, sous les blés, les haies vives, les jeunes arbres. Maintenant, en plein ciel, le soleil d'avril rayonnait dans sa gloire, échauffant la terre qui enfantait. Du flanc nourricier jaillissait la vie, les bourgeons crevaient en feuilles vertes, les champs tressaillaient de la poussée des herbes. De toutes parts, des graines se gonflaient, s'allongeaient, gerçaient la plaine, travaillées d'un besoin de chaleur et de lumière. Un débordement de sève coulait avec des voix chuchotantes, le bruit des germes s'épandait en un grand baiser. Encore, encore, de plus en plus distinctement, comme s'ils se fussent rapprochés du sol, les camarades tapaient. Aux rayons enflammés de l'astre, par cette matinée de jeunesse, c'était de cette rumeur que la campagne était grosse. Des hommes poussaient, une armée noire, vengeresse, qui germait lentement dans les sillons, grandissant pour les récoltes du siècle futur, et dont la germination allait faire bientôt éclater la terre.
You were not far...
Once items() is sorted, you just have to convert that back to a dict and sort the values:
...
# print(dict_wl)
s_dict_w1 = {k: sorted(v) for k,v in sorted(dict_w1.items())}
return s_dict_wl
I've made a bot that can play audio through discord but what i want to do now is to make him to say the url in the chat.
#bot.command(pass_context = True)
async def play(ctx,*,query : str):
opts = {'default_search': 'auto','quiet': True,} #options pour youtube-dl que je comprends pas
if voice == None: #si le bot n'a pas encore été connecté à un channel
await bot.say('Summon me in your channel first (!summon)')
elif query[:3] == 'url':
try:
n = int(query[4])
await bot.say(videos[n][0])
except Exception as e:
await bot.say (e)
elif len(query) != 1: #si le joueur essaie de taper !play recherche et non !play 1/2/3/4
videos = yt.recherche(query,4) #on charge les informations des vidéos avec le module yt
for i in range(4): #on affiche les 4 résultas avec un emebed contenant un apercu de chaque vidéo
em = discord.Embed(title=videos[i][1], colour=0xff0000, type = 'rich')
em.set_thumbnail(url='https://i.ytimg.com/vi/'+videos[i][0][32:]+'/hqdefault.jpg?sqp=-oaymwEXCNACELwBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDBtpHoodvOvDCPjzg9t7PzSljI3A')
await bot.send_message(ctx.message.channel,None,embed=em)
await bot.say('Make your choice! (!play 1/2/3/4)')
else: #si le joueur essaie de choisir une video avec !play 1/2/3/4
try:
if player != None: #si le bot joue déjà une chanson, on stoppe la précédente avant de commencer la suivante (sinon ca plante)
player.stop()
query = int(query) #on convertit en entier : str -> int
player = await voice.create_ytdl_player(videos[query-1][0],ytdl_options=opts) #on initialise le player audio dans la varialble globale
player.volume = 0.2 #on fixe le volume
player.start() #on démarre la lecture
except Exception as e: #exception atteinte en général si on a pas réussi à faire query = int(query), c'est à dire que le joueur à fait une faute de frappe
await bot.say(e)
my problem is when i want to change the elif query:3 to something else to shorter the "url" i wanted to put like .play -u .... but i can't make it work
import requests #librairie de base permettant d'ouvrir une page web dans la console en gros
def recherche(query,nb):
query = query.replace(' ','+')
url = 'https://www.youtube.com/results?search_query='+query
r = requests.get(url).text
balise = 'data-context-item-id="' #balise signalant l'élément manquant dans le code source
liste_videos = []
for e in range(nb): #on ajoute les url de chaque video
liste_videos.append([])
i = r.index(balise) #renvoie la position de la balise dans le code
liste_videos[-1].append('https://www.youtube.com/watch?v='+r[i+22:i+22+11])
r = r[i+100:] #on coupe le début du code pour aller chercher dans la suite plus facilement
for vid in range(nb): #puis leurs titre
url = liste_videos[vid][0] #on prend l'url d'une video
r = requests.get(url).text #on ouvre la page correspondante
title = r[r.index('<title>')+7:r.index('</title>')] #et on cherche le titre dedans
liste_videos[vid].append(title) #puis on met le titre dans le tableau video
u = liste_videos[vid][0]
return liste_videos #on finit par renvoyer ce tableau
hacky: suppose you call the bot with "play u1"
elif query[0] == 'u':
try:
n = int(query[1])
await bot.say(videos[n][0])
essentially query is string which can be accesd like a list. Have a look here:
How to get char from string by index?