How to split sentences without punctuation end in a review?

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.


Solution 1:

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']]