Verwenden Sie den Levenstein-Abstand. "Lebensstein-Distanz" wird auch als "Bearbeitungsdistanz" bezeichnet. Dies ist die Mindestanzahl von Schritten, die erforderlich sind, um eine Zeichenfolge in die andere Zeichenfolge umzuwandeln, indem ein Zeichen "eingefügt", "gelöscht" und "ersetzt" wird.
Zum Beispiel von "Katze" bis "Schnitt"
cat
→ c t
→ cut
to`` adelete,
uinsert"
2`.
Es ist leicht zu glauben, dass der Levenstein-Abstand "1" ist, da Sie die Substitution verwenden können.
Weitere Informationen finden Sie unter [Wiki](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%83%99%E3%83%B3%E3%82%B7%E3 Siehe% 83% A5% E3% 82% BF% E3% 82% A4% E3% 83% B3% E8% B7% 9D% E9% 9B% A2). In diesem Tutorial werden wir schließlich die Namen identifizieren, während wir einige Experimente durchführen.
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: #Wenn der Referenz-Levenstein-Abstand kleiner als 1 ist, das heißt, auch wenn er etwas anders ist, werfen Sie ihn in Kategorien.
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']
Das Programm ist so, dass alle Elemente mit einem Referenz-Levenstein-Abstand von "1" oder mehr "Kategorien" eingeben. Wir werden es basierend darauf umgestalten. Erhöhen Sie zunächst schrittweise den Abstand und beobachten Sie, was mit dem Ausgang passiert.
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']
Aus diesem Ausgabeergebnis ist ersichtlich, dass Mehrdeutigkeit zulässig ist, wenn der Levenstein-Abstand vergrößert wird. Zum Beispiel, ob "oniku_a" und "oniku_b" als dieselbe Klassifizierung betrachtet werden sollen. Wenn der Referenz-Levenstein-Abstand klein ist, wird er "als unterschiedlich angesehen". Wenn der Levenstein-Referenzabstand groß ist, "Nun, betrachten wir ihn als gleich".
Aus dem obigen Ausgabeergebnis scheint es auch gut zu sein, die anfängliche Liste der Kategorien auf "['kome', 'oniku', 'yasai']" anstelle von "['kome']" zu setzen.
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']
Von oben, für dieses "Ziel", cates Anfangswert: "['kome', 'oniku', 'yasai']", es wurde festgestellt, dass der Name mit einem Levenstein-Abstand von weniger als "3" identifiziert werden kann.
Dann ist es schließlich ein Namensidentifizierungsprogramm.
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)]
Die Art und Weise, die Ausgabe zu lesen, ist ("vor", "nach", "vor und nach der Levenstein-Distanz"). Es kann bestätigt werden, dass der Levenstein-Abstand kleiner als "3" ist und der Name identifiziert werden kann.
Recommended Posts