Utilisez la distance de Levenstein. La "distance de Lebenstein" est également appelée "distance d'édition". Il s'agit du nombre minimum d'étapes requises pour transformer une chaîne de caractères en une autre chaîne de caractères en «insérant», «supprimant» et «remplaçant» un caractère.
Par exemple, de «chat» à «couper»
cat
→ c t
→ cut
et 2
de" ʻa supprimer, ʻu
insérer ".
Il est facile de penser que la distance de Levenstein est «1» car vous pouvez utiliser la substitution.
Pour plus d'informations [Wiki](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%83%99%E3%83%B3%E3%82%B7%E3 Voir% 83% A5% E3% 82% BF% E3% 82% A4% E3% 83% B3% E8% B7% 9D% E9% 9B% A2). Dans ce tutoriel, nous allons enfin identifier les noms tout en faisant quelques expériences.
test0
import Levenshtein
target = ['oniku_a', 'oniku_b', 'oniku_c', 'yasai_a', 'yasai_b', 'yasai_c']
cates = ['kome']
for val in target:
nearL_flag = False
for cate in cates:
if Levenshtein.distance(val, cate) < 1: #Si la distance de Levenstein de référence est inférieure à 1, c'est-à-dire même un peu différente, mettez-la en catégories.
nearL_flag = True
if not nearL_flag:
cates.append(val)
cates
output
['kome', 'oniku_a', 'oniku_b', 'oniku_c', 'yasai_a', 'yasai_b', 'yasai_c']
Le programme est tel que tous les éléments avec une distance de Levenstein de référence de «1» ou plus entrent dans des «catégories». Nous allons le remodeler sur cette base. Tout d'abord, augmentez progressivement la distance et observez ce qui arrive à la sortie.
test1
import Levenshtein
target = ['oniku_a', 'oniku_b', 'oniku_c', 'yasai_a', 'yasai_b', 'yasai_c']
for i in range(10):
cates = ['kome']
for val in target:
nearL_flag = False
for cate in cates:
if Levenshtein.distance(val, cate) < i:
nearL_flag = True
if not nearL_flag:
cates.append(val)
print(i, cates)
output
0 ['kome', 'oniku_a', 'oniku_b', 'oniku_c', 'yasai_a', 'yasai_b', 'yasai_c']
1 ['kome', 'oniku_a', 'oniku_b', 'oniku_c', 'yasai_a', 'yasai_b', 'yasai_c']
2 ['kome', 'oniku_a', 'yasai_a']
3 ['kome', 'oniku_a', 'yasai_a']
4 ['kome', 'oniku_a', 'yasai_a']
5 ['kome', 'oniku_a', 'yasai_a']
6 ['kome', 'oniku_a', 'yasai_b']
7 ['kome', 'yasai_a']
8 ['kome']
9 ['kome']
À partir de ce résultat de sortie, on peut voir que l'ambiguïté est autorisée lorsque la distance de Levenstein est augmentée.
Par exemple, s'il faut considérer oniku_a '' et
oniku_b '' comme la même classification
Si la distance de Levenstein de référence est petite, elle est "considérée comme différente"
Si la distance de référence de Levenstein est grande, "Eh bien, considérons-la comme la même".
En outre, à partir du résultat de sortie ci-dessus, il semble bon de définir la liste initiale des catégories sur ['kome', 'oniku', 'yasai']
au lieu de ['kome']
.
['kome', 'oniku', 'yasai']
et essayez d'identifier le nom.test2
import Levenshtein
target = ['oniku_a', 'oniku_b', 'oniku_c', 'yasai_a', 'yasai_b', 'yasai_c']
for i in range(10):
cates = ['kome', 'oniku', 'yasai']
for val in target:
nearL_flag = False
for cate in cates:
if Levenshtein.distance(val, cate) < i:
nearL_flag = True
if not nearL_flag:
cates.append(val)
print(i, cates)
output
0 ['kome', 'oniku', 'yasai', 'oniku_a', 'oniku_b', 'oniku_c', 'yasai_a', 'yasai_b', 'yasai_c']
1 ['kome', 'oniku', 'yasai', 'oniku_a', 'oniku_b', 'oniku_c', 'yasai_a', 'yasai_b', 'yasai_c']
2 ['kome', 'oniku', 'yasai', 'oniku_a', 'yasai_a']
3 ['kome', 'oniku', 'yasai']
4 ['kome', 'oniku', 'yasai']
5 ['kome', 'oniku', 'yasai']
6 ['kome', 'oniku', 'yasai']
7 ['kome', 'oniku', 'yasai']
8 ['kome', 'oniku', 'yasai']
9 ['kome', 'oniku', 'yasai']
D'après ce qui précède, pour cette «cible»,
cates la valeur initiale: ['kome', 'oniku', 'yasai']
, il a été trouvé que le nom peut être identifié avec une distance de Levenstein inférieure à "3".
Puis, enfin, c'est un programme d'identification de nom.
nayose
import Levenshtein
target = ['oniku_a', 'oniku_b', 'oniku_c', 'yasai_a', 'yasai_b', 'yasai_c']
cates = ['kome', 'oniku', 'yasai']
nayose = []
for val in target:
minL = 100
afterNayose = 'dummy'
for cate in cates:
tmp_distance = Levenshtein.distance(val, cate)
if tmp_distance < minL:
minL = tmp_distance
afterNayose = cate
nayose.append(afterNayose)
[(before, after, Levenshtein.distance(before, after)) for before, after in zip(target, nayose)]
output
[('oniku_a', 'oniku', 2),
('oniku_b', 'oniku', 2),
('oniku_c', 'oniku', 2),
('yasai_a', 'yasai', 2),
('yasai_b', 'yasai', 2),
('yasai_c', 'yasai', 2)]
La façon de lire la sortie est (avant
, après
, avant et après la distance de Levenstein
).
Il peut être confirmé que la distance de Levenstein est inférieure à «3» et le nom peut être identifié.
Recommended Posts