简体   繁体   English

如何在评论中拆分没有标点符号的句子?

[英]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.这个是我用的function 但是没有考虑最后一句没有标点符号的情况。


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.上面的 function function 运行良好,但没有考虑到字符串没有标点符号或字符串的最后一句没有标点符号的情况。 It ignores and just return the sentences where the end was a punctuation.它忽略并只返回结尾是标点符号的句子。

It's easier with nltk as suggested by @TimBiegeleisen. nltk所建议的那样,使用 nltk 更容易。 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: 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]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM