Vérifiez si une chaîne est un possible pour un abréviation nom
-
27-10-2019 - |
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 pourfc kopenhavn
car elle correspond aux premiers caractères du mot.fhk
ne correspondrait pas à. -
fco
ne doit pas correspondrefc kopenhavn
parce que personne ne serait irl abbrevate FC Kopenhavn comme FCO. -
irl
est un match pourin real life
. -
ifk
est un match pourifk goteborg
. -
aik
est un match pourallmanna idrottskluben
. -
aid
est un match pourallmanna 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 pourmanchester 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.
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')