Question

Je suis en train de développer un algorithme de python pour vérifier si une chaîne pourrait être une abbréviation pour un autre mot. Par exemple

  • fck est un match pour fc kopenhavn car elle correspond aux premiers caractères du mot. fhk ne correspondrait pas à.
  • fco ne doit pas correspondre fc kopenhavn parce que personne ne serait irl abbrevate FC Kopenhavn comme FCO.
  • irl est un match pour in real life.
  • ifk est un match pour ifk goteborg.
  • aik est un match pour allmanna idrottskluben.
  • aid est un match pour allmanna idrottsklubben. Ce n'est pas un vrai nom équipe abréviation, mais je pense qu'il est difficile de l'exclure, sauf si vous appliquez le domaine des connaissances spécifiques sur la manière suédoise abbréviations sont formés.
  • manu est un match pour manchester united.

Il est difficile de décrire les règles exactes de l'algorithme, mais j'espère que mes exemples montrent ce que je suis après.

Mise à jour J'ai fait une erreur en montrant les cordes avec les lettres correspondantes en majuscule. Dans le scénario réel, toutes les lettres sont en minuscules de sorte qu'il ne soit pas aussi facile que de vérification qui sont des lettres en majuscules.

Était-ce utile?

La solution

passe tous les tests, y compris quelques I supplémentaires créés. Il utilise la récursivité. Voici les règles que j'ai utilisé:

  • La première lettre de l'abréviation doit correspondre à la première lettre de le texte
  • Le reste de l'abréviation (la abbrev moins la première lettre) doit être une abréviation pour:

    • les mots restants, ou
    • le reste du texte à partir de une position dans le premier mot.

tests=(
    ('fck','fc kopenhavn',True),
    ('fco','fc kopenhavn',False),
    ('irl','in real life',True),
    ('irnl','in real life',False),    
    ('ifk','ifk gotebork',True),   
    ('ifko','ifk gotebork',False),    
    ('aik','allmanna idrottskluben',True),
    ('aid','allmanna idrottskluben',True),
    ('manu','manchester united',True), 
    ('fz','faz zoo',True), 
    ('fzz','faz zoo',True),
    ('fzzz','faz zoo',False),    
    )

def is_abbrev(abbrev, text):
    abbrev=abbrev.lower()
    text=text.lower()
    words=text.split()
    if not abbrev:
        return True
    if abbrev and not text:
        return False
    if abbrev[0]!=text[0]:
        return False
    else:
        return (is_abbrev(abbrev[1:],' '.join(words[1:])) or
                any(is_abbrev(abbrev[1:],text[i+1:])
                    for i in range(len(words[0]))))

for abbrev,text,answer in tests:
    result=is_abbrev(abbrev,text)
    print(abbrev,text,result,answer)
    assert result==answer

Autres conseils

Voici une façon d'accomplir ce que vous semblez vouloir faire

import re    
def is_abbrev(abbrev, text):
    pattern = ".*".join(abbrev.lower())
    return re.match("^" + pattern, text.lower()) is not None

Le caret veille à ce que le premier caractère de l'abréviation correspond au premier caractère du mot, il devrait être vrai pour la plupart des abréviations.

Modifier : Votre nouvelle mise à jour a changé les règles un peu. En utilisant "(|.*\s)" au lieu de ".*" les personnages de l'abréviation ne correspondra si elles sont à côté de l'autre, ou si le caractère suivant apparaît au début d'un nouveau mot.

Ceci correspondre correctement avec fck FC Kopenhavn, mais fco ne sera pas. Cependant, correspondant aik avec allmanna idrottskluben sera pas travail, qui exige la connaissance de la langue suédoise et est pas aussi trivial de le faire.

Voici le nouveau code avec la modification mineure

import re    
def is_abbrev(abbrev, text):
    pattern = "(|.*\s)".join(abbrev.lower())
    return re.match("^" + pattern, text.lower()) is not None

@Ocaso Protal dit dans le commentaire how should you decide that aik is valid, but aid is not valid? et il a raison.

Le algo qui est venu dans mon esprit est de travailler avec word threshold (nombre de mots séparés par un espace).

words = string.strip().split()
if len(words) > 2:
   #take first letter of every word
elif len(words) == 2:
   #take two letters from first word and one letter from other
else:
   #we have single word, take first three letter or as you like

vous devez définir votre logique, vous ne trouvez pas aveuglément abréviation.

Votre algorithme semble simple - l'abréviation est la concaténation de toutes les lettres majuscules. donc:

upper_case_letters = "QWERTYUIOPASDFGHJKLZXCVBNM"
abbrevation = ""
for letter in word_i_want_to_check:
    if letter in letters:
        abbrevation += letter
for abb in _list_of_abbrevations:
    if abb=abbrevation:
        great_success()

Cela peut être assez bon.

def is_abbrevation(abbrevation, word):
    lowword = word.lower()
    lowabbr = abbrevation.lower()

    for c in lowabbr:
        if c not in lowword:
            return False

    return True

print is_abbrevation('fck', 'FC Kopenhavn')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top