J'ai deux tableaux de chaînes, par exemple des phrases et des mots. Si un mot est trouvé dans une phrase, par ex. sentence =~ /#{word}/
Je veux rejeter la phrase du tableau de phrases. C'est facile à faire avec une double boucle, mais je me demande s'il y a une façon plus efficace de le faire, peut-être avec des opérateurs logiques?Comment rejeter efficacement les chaînes dans un tableau si elles (regex) correspondent à des chaînes dans un second tableau dans Ruby?
Répondre
Vous pourriez joindre tous les mots ensemble dans une expression régulière, avec les mots séparés par le "|" personnage.
sentence =~ /word1|word2|..../
Vous pouvez convertir le tableau de mots en une expression rationnelle appropriée avec array.join ("|").
Si les mots sont susceptibles de contenir des métacaractères regex, placez chaque mot entre parenthèses sans capture.
sentence =~ /(?:word1)|(?:word2)|..../
En utilisant une seule regex devrait être beaucoup plus efficace que boucle à travers le réseau de mots, puisque le regex sera compilé dans un seul statetable.
Array subtraction est votre ami ici:
words.each do |word|
sentences -= sentences.grep(/#{word}/)
end
Il est toujours la même complexité temporelle de base (probablement globalement moins efficace), mais vous pouvez obtenir autour de l'écriture la double boucle. Sachez qu'avec cette solution, les mots ne doivent pas nécessairement correspondre à des mots entiers séparés par des espaces dans la phrase. Ainsi, le mot cat
écraserait la phrase: String concatenation is gross
.
Merci p. Faire quelque chose de similaire en ce moment mais votre version un peu plus jolie. Conscient des problèmes de regex, je voulais juste un exemple simple pour illustrer le problème. – Matt
words = [...]
sentences = [....]
result = sentences.select{|sentence| !words.any?{|word| sentence =~ /#{word}/}}
Joining cordes dans une expression rationnelle est une idée assez mauvaise, car retours en arrière ralentit les choses horriblement et parce que vous exécutez dans des limites sur la taille de regex assez rapidement. (Bien que cela puisse bien fonctionner dans la pratique si wordarray
est petit)
Envisagez d'utiliser l'une des solutions Ruby Quiz DictionaryMatcher.
Vous pouvez alors fonctionner comme suit:
dm=DictionaryMatcher.new
wordarray.each{|w| dm << w}
sentencearray.reject{|s| s =~ dm}
Merci beaucoup pour les pointeurs, les arbres de préfixe sont cool, et en fait j'ai un commentaire dans le code existant pour les vérifier pour ce problème. – Matt
Ce n'est pas le préfixe-arbres qui est cool. C'est le jumelage de Knuth-Morris-Pratt qui est cool, bien qu'il y ait un autre algorithme moins efficace sur le plan théorique dans les solutions qui ont néanmoins été mieux référencées. –
- 1. couper toutes les chaînes dans un tableau
- 2. Ruby regex correspondant à des chaînes d'un tableau?
- 3. PHP: tableau Répartition des chaînes dans un tableau multidimensionnel
- 4. Tableau de chaînes pour un tableau d'objets
- 5. Comment puis-je trouver des chaînes non ascii dans un tableau de chaînes, dans Rails 2.0/ruby 1.8.6?
- 6. Comment remplacer un élément dans un tableau de chaînes?
- 7. Convertir un tableau d'entiers en un tableau de chaînes dans Ruby?
- 8. Tableau de chaînes dans asp.net
- 9. Comment styler du texte dans un tableau de chaînes?
- 10. Obtention des valeurs ListView dans un tableau de chaînes?
- 11. Étant donné une chaîne et un tableau de chaînes, comment calculer efficacement les occurrences du tableau dans String?
- 12. Comment rechercher un tableau dans Ruby?
- 13. Comment créer un tableau pour stocker des correspondances de chaînes regex dans java?
- 14. Copier un tableau de chaînes dans un autre
- 15. Comment transformer un tableau de chaînes NSArray en un tableau de chaînes uniques, dans le même ordre?
- 16. Comment incorporer un tableau de chaînes dans une entité (JPA)
- 17. Comment créer un tableau de chaînes dans matlab?
- 18. Comment créer un tableau statique constant de chaînes dans C#?
- 19. Comment diviser plusieurs chaînes dans un tableau imbriqué en profondeur?
- 20. Comment retourner un tableau de chaînes 2D dans Java?
- 21. Regex fractionnement des chaînes sur un caractère, non contenu dans()
- 22. Comment trier un tableau de chaînes?
- 23. Terminer si déclaration avec des chaînes et un tableau de chaînes
- 24. Comment déclarer un tableau C de chaînes
- 25. Tableau de chaînes dans Fortran 77
- 26. Recherche dans tableau de chaînes non triés
- 27. Ajouter des chaînes à un tableau à deux dimensions
- 28. Comment fusionner des sous-tableaux dans un tableau dans Ruby?
- 29. Comment vérifier si un objet est une chaîne ou un tableau de chaînes dans Java?
- 30. Comment puis-je accéder à des méthodes basées sur des chaînes dans un tableau?
En relisant cela, on ne sait pas ce que vous entendez par « Je veux rejeter du tableau » - vous rejetez les éléments du tableau de mots ou le tableau de phrases? –
Droit, déroutant. Clarifié. – Matt