J'ai une liste de phrases (n-grammes) qui doivent être supprimées d'une phrase donnée.
new_sentence = 'Oranges are the main ingredient for a wide of'
4 Réponses :
Vous allez ici résultats: p>
Vous n'avez pas supprimé nourriture et boissons code>, qui est le même problème qu'il a.
Puisque vous voulez correspondre à des mots entiers uniquement, je pense que la première étape consiste à tout transformer en listes de mots, puis à parcourir des mots les plus longs à la phrase la plus courte afin de trouver des éléments à supprimer:
>>> removed = ['range', 'drinks', 'food and drinks', 'summer drinks'] >>> sentence = 'Oranges are the main ingredient for a wide range of food and drinks' >>> words = sentence.split() >>> for ngram in sorted([r.split() for r in removed], key=len, reverse=True): ... for i in range(len(words) - len(ngram)+1): ... if words[i:i+len(ngram)] == ngram: ... words = words[:i] + words[i+len(ngram):] ... break ... >>> " ".join(words) 'Oranges are the main ingredient for a wide of'
Merci, @Samwise, cela fonctionne pour mon exemple donné. Malheureusement, mes données réelles ont des doublons, y a-t-il un moyen de la surmonter?
Comme suggéré, lottez les mises à jour; Au lieu de modifier les mots code> à l'intérieur de cette boucle et de casser, ajoutez i code> dans une liste et continuez. Ensuite, faites la modification de tout dans la liste à la fois. Alternativement, faites cette itération dans l'ordre inverse (c'est-à-dire inverser la plage), puis vous pouvez modifier la liste sans casser l'itération.
temps d'expression régulier!
In [116]: removed = ['range', 'drinks', 'food and drinks', 'summer drinks']
...: removed = sorted(removed, key=len, reverse=True)
...: sentence = 'Oranges are the main ingredient for a wide range of food and drinks'
...: new_sentence = sentence
...: import re
...: removals = [r'\b' + phrase + r'\b' for phrase in removed]
...: for removal in removals:
...: new_sentence = re.sub(removal, '', new_sentence)
...: new_sentence = ' '.join(new_sentence.split())
...: print(sentence)
...: print(new_sentence)
Oranges are the main ingredient for a wide range of food and drinks
Oranges are the main ingredient for a wide of
import re
removed = ['range', 'drinks', 'food and drinks', 'summer drinks']
sentence = 'Oranges are the main ingredient for a wide range of food and drinks'
# sort the removed tokens according to their length,
removed = sorted(removed, key=len, reverse=True)
# using word boundaries
for r in removed:
sentence = re.sub(r"\b{}\b".format(r), " ", sentence)
# replace multiple whitspaces with a single one
sentence = re.sub(' +',' ',sentence)
I hope this would help:
first, you need to sort the removed strings according to their length, in this way 'food and drinks' will be replaced before 'drinks'
Vous devriez probablement utiliser une bibliothèque de traitement de langue naturelle pour cela si vous devez gérer les pluriels.
Avez-vous essayé de boucler dans la liste supprimée et détectez-vous pour chaque index s'il est dans la phrase?
Vous pouvez résoudre le deuxième problème en triant la liste code> supprimée code> avec les expressions plus longues d'abord.