python
  • parsing
  • full-text-search
  • negate
  • 2015-02-26 1 views -2 likes 
    -2

    Je cherche une bibliothèque qui me permettrait de faire quelque chose comme ce qui suit:recherche Python texte bibliothèque

    matches(
        user_input="hello world how are you what are you doing", 
        keywords='+world -tigers "how are" -"bye bye"' 
    ) 
    

    Fondamentalement, je veux le faire correspondre les chaînes en fonction de la présence de mots, l'absence de mots et de séquences de mots . Je n'ai pas besoin d'un moteur de recherche à la Solr, car les chaînes ne seront pas connues à l'avance et ne seront recherchées qu'une seule fois. Une telle bibliothèque existe-t-elle déjà et, si oui, où la trouverais-je? Ou suis-je voué à la création d'un générateur regex?

    +0

    essayez nltk.org. Thats la bibliothèque de traitement de langage naturel pour python – Kelvin

    +0

    Vous ne savez pas quelle taille de données vous voulez correspondre, mais Lucene/Solr est la meilleure option pour une application à plus grande échelle - http://lucene.apache.org/solr/. Regardez aussi [pysolr] (https://github.com/toastdriven/pysolr). –

    +0

    Je cherche à faire correspondre de très petites quantités de données: des chaînes de moins de 100 mots utilisant des règles de mots-clés de quelques mots seulement. Une fois l'appariement terminé, je n'ai plus d'utilité pour la chaîne d'origine, donc je ne pense pas que Solr soit ce dont j'ai besoin. Je n'ai pas non plus besoin que la recherche soit floue ou spécifique à une langue. – ipartola

    Répondre

    0

    regex module supports listes nommées:

    import regex 
    
    def match_words(words, string): 
        return regex.search(r"\b\L<words>\b", string, words=words) 
    
    def match(string, include_words, exclude_words): 
        return (match_words(include_words, string) and 
          not match_words(exclude_words, string)) 
    

    Exemple:

    if match("hello world how are you what are you doing", 
         include_words=["world", "how are"], 
         exclude_words=["tigers", "bye bye"]): 
        print('matches') 
    

    Vous pouvez créer des listes nommées avec module standard re par exemple:

    import re 
    
    def match_words(words, string): 
        re_words = '|'.join(map(re.escape, sorted(words, key=len, reverse=True))) 
        return re.search(r"\b(?:{words})\b".format(words=re_words), string) 
    

    comment puis-je construire la liste des inclus mots ed et exclus basés sur les grammaires +, - et ""?

    Vous pouvez utiliser shlex.split():

    import shlex 
    
    include_words, exclude_words = [], [] 
    for word in shlex.split('+world -tigers "how are" -"bye bye"'): 
        (exclude_words if word.startswith('-') else include_words).append(word.lstrip('-+')) 
    
    print(include_words, exclude_words) 
    # -> (['world', 'how are'], ['tigers', 'bye bye']) 
    
    +0

    Intelligent et probablement plus rapide que la solution d'Amrita, mais je ne pense pas que cela m'aide non plus avec le mot-clé grammaire, à moins que je ne manque de magie dans la création de re_words. – ipartola

    +0

    J'ai mis à jour la réponse pour montrer comment re_words est utilisé dans l'implémentation de la fonction match() et comment analyser ''+ world -tigers' 'comment sont" - "bye bye"' '. – jfs

    +0

    Parfait. Je n'ai pas réalisé que shlex ferait cela avec juste la fonction split. C'est parfait! – ipartola

    0

    De l'exemple que vous avez donné, vous n'avez pas besoin Regex à moins que vous êtes à la recherche des modèles/expressions dans les mots ..

    d="---your string ---" 
        mylist= d.split() 
        M=[] 
        Excl=["---excluded words---"] 
        for word in mylist: 
         if word not in Excl: 
          M.append(word) 
        print M 
    

    Vous peut écrire une fonction générique qui peut être utilisée avec n'importe quelle liste de chaînes et liste d'exclusion.

    +0

    Bien sûr, cela fonctionne, mais comment puis-je construire la liste des mots inclus et exclus basés sur la grammaire +, -, et ""? Existe-t-il une solution prête à l'emploi, ou devrais-je utiliser lex pour la créer? – ipartola

    +0

    * "vous n'avez pas besoin de Regex" * mais les expressions rationnelles sont utiles. La solution basée sur regex ne regarde la chaîne que deux fois. La solution que vous voyez est la 'len (mylist)' fois, c'est-à-dire '' 100' fois. – jfs

     Questions connexes

    • Aucun problème connexe^_^