0
votes

Supprimer une liste de phrases de la chaîne

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'


3 commentaires

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 supprimée avec les expressions plus longues d'abord.


4 Réponses :


-2
votes

Vous allez ici xxx

résultats: xxx


1 commentaires

Vous n'avez pas supprimé nourriture et boissons , qui est le même problème qu'il a.



1
votes

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'


2 commentaires

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 à l'intérieur de cette boucle et de casser, ajoutez i 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.



0
votes

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


0 commentaires

0
votes
    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'

0 commentaires