|
|
[MMF2] Sprawdzanie %towe zgodności tekstu |
Autor |
Wiadomość |
Amaranthus
Starszy szeregowy
Główny edytor:
Drugi edytor:
Posty: 11
192 Prestiż
|
Wysłany: 07-10-2017, 23:27 [MMF2] Sprawdzanie %towe zgodności tekstu
|
|
|
Witam, chciałbym wykonać porównanie 2 różnych tekstów, gdzie np. przy zgodności większej, niż 75% wykonuje się akcja.
Pierwszy pomysł to: rozbicie pliku typu .txt, który zawiera miliony znaków na pewnego rodzaju listę, którą będę mógł następnie porównywać z inną, gotową listą. Myślałem nad String Parser, natomiast, on działa jakby w drugą stronę, niż bym chciał. Próbowałem również listą otworzyć plik, ale też otwierało, aż 1 linię tekstu.
Drugi pomysł to: Testowanie na Rich Edit Object, ale mimo, że ślicznie mi otwiera mój plik, to nie mam pomysłu jak zrobić porównanie z drugim Rich Edit Object'em.
Wyobrażałem rozwiązanie sobie jako sprawdzanie po kolei każdego znaku, gdzie przy poprawności przyznawany był punkt, a następnie przekształcenie całości na ułamek, a co za tym idzie %.
Jakiś pomysł na rozwiązanie? z góry dziękuję |
|
|
|
|
Wackyjackie
Bohater Starszy Chorąży Sztabowy Randomu
Główny edytor:
Drugi edytor:
Pojedynki: nie
Pomógł: 69 razy Posty: 717
36331 Prestiż
|
Wysłany: 08-10-2017, 16:00
|
|
|
Porównywanie po kolei znaków ma średni sens, bo jak w jednym miejscu brakło by jednego znaku tekstu to cała reszta byłaby skazana na "mismatch".
Najlepszym rozwiązaniem byłoby jednak zaimplementowanie tzw. odległości Levenshteina:
https://pl.wikipedia.org/wiki/Odległość_Levenshteina |
_________________
|
|
|
|
|
Amaranthus
Starszy szeregowy
Główny edytor:
Drugi edytor:
Posty: 11
192 Prestiż
|
Wysłany: 08-10-2017, 20:06
|
|
|
No dobrze, to by było dobre rozwiązanie, teraz tylko powstaje pytanie, którym pluginem najlepiej to wykonać? Znalazłem łatwo w internecie już rozwiązania w C# oraz np. Java Levenstheina.
Do C# znalazłem .net Script, wszystko się kompiluje bez errorów, natomiast jest to C# napisany na konsolę. Może i znam podstawy C#, natomiast nie bardzo wiem, jak korzystać z ów pluginu, mógłby ktoś mi pokazać przykład korzystania z .net Script? Tak, abym wiedział jako korzystać w ogóle ze zmiennych, bo w końcu w moim rozumowaniu "kod" MMFa, a kod zapisany w C# to dwa różne pliki, nie wiem, jak to się godzi ze sobą.
Kod: | using System;
// Odleglosc Levenshteina (odleglosc edycyjna)
// www.algorytm.org
// (c) 2009 Tomasz Lubinski
namespace Levenshtein___CS
{
/// <summary>
/// Odleglosc Levenshteina (odleglosc edycyjna)
/// www.algorytm.org
/// (c) 2009 Tomasz Lubinski
/// </summary>
class Levenshtein
{
/// <summary>
/// Odleglosc Levenshteina (odleglosc edycyjna)
/// </summary>
/// <param name="s">pierwszy ciag</param>
/// <param name="t">drugi ciaf</param>
/// <returns>Odleglosc Levenshteina</returns>
private static int levenshtein(String s, String t)
{
int i, j, m, n, cost;
int [,]d;
m = s.Length;
n = t.Length;
d = new int[m+1, n+1];
for (i=0; i<=m; i++)
d[i, 0] = i;
for (j=1; j<=n; j++)
d[0, j] = j;
for (i=1; i<=m; i++)
{
for (j=1; j<=n; j++)
{
if (s[i-1] == t[j-1])
cost = 0;
else
cost = 1;
d[i, j] = Math.Min(d[i-1, j] + 1, /* remove */
Math.Min(d[i, j-1] + 1, /* insert */
d[i-1, j-1] + cost)); /* change */
}
}
return d[m, n];
}
/// <summary>
/// Odleglosc Levenshteina (odleglosc edycyjna).
/// </summary>
[STAThread]
static void Main(string[] args)
{
String s, t;
Console.WriteLine("Podaj pierwszy ciag");
s = Console.ReadLine();
Console.WriteLine("Podaj drug ciag");
t = Console.ReadLine();
Console.WriteLine("Odleglosc Levenshteina wynosi: " + levenshtein(s, t));
}
}
}
|
Chyba, że proponowałbyś mi napisać to w javie (ją znam znacznie gorzej, niż C# jeszcze ), aktualnie szukam pluginu korzystającego do pisania w Java (po opisach pluginów) i żadnego nie znalazłem (zapewne po prostu nie wspomniany jest w opisie, że służy do Javy).
Czy też najlepiej zrobić łopatologicznie w MMF'ie? Chociaż nie bardzo rozumiem działanie Levenstheina. Bo czemu to przechodzi na 2wymiarową tablicę? I również nie mam zbytnio pomysłu, jak zrobić minimum oraz właściwie nie znam długości jednego z ciągów, co nie wiem czy nie jest czasem wymogiem do tego algorytmu?
//Edit: A może tak Lua? https://gist.github.com/Badgerati/3261142#file-levenshtein_algorithm-lua Też wygląda jakby tym się udało?
Lub też Python Object ? Wszystkie te języki mają rozwiązanie, ale w każdym nie wiem jak otrzymać efekty i zdefiniować ciągi, które ma badać. |
|
|
|
|
Wackyjackie
Bohater Starszy Chorąży Sztabowy Randomu
Główny edytor:
Drugi edytor:
Pojedynki: nie
Pomógł: 69 razy Posty: 717
36331 Prestiż
|
Wysłany: 08-10-2017, 21:46
|
|
|
https://www.dropbox.com/s...shtein.mfa?dl=0
Generalnie ten sam kod z LUA co go podlinkowałeś z GitHub sprzężony z MMF za pomocą wtyczki XLUA. Oczywiście można przenieść algorytm do kodu MMFa, ale nie miałem na to czasu. |
_________________
|
|
|
|
|
Amaranthus
Starszy szeregowy
Główny edytor:
Drugi edytor:
Posty: 11
192 Prestiż
|
Wysłany: 08-10-2017, 22:46
|
|
|
Coś jeszcze mi nie działa, totalny brak reakcji.
Tak się zastanawiam, wypadałoby połączyć z moim plikiem z kodem .lua (pobrałem bezpośrednio z powyższego linku i nic nie zmieniłem), więc zrobiłem jak na screenie, też się zastanawiam nad tym, użyłeś opcji "Push String Parameter", Lua jakoś samo automatycznie uzupełnia po kolei zmienne? Logiczniejsze wydaje mi się ustawienie Zmiennego Stringu i nadanie mu nazwy (z tego co wnioskuję z kodu to str1 i str2)
Call Function próbowałem dal 2 wersji, z nawiasem oraz bez.
Co muszę poprawić? |
|
|
|
|
Wackyjackie
Bohater Starszy Chorąży Sztabowy Randomu
Główny edytor:
Drugi edytor:
Pojedynki: nie
Pomógł: 69 razy Posty: 717
36331 Prestiż
|
Wysłany: 09-10-2017, 17:09
|
|
|
Ale o co chodzi, przykład który wstawiłem na pewno działa . Push parameter kolejno odkłada parametry które mają zostać przekazane do metody, wywołanie call function czyści tę listę parametrów.
I po co wołać skrypt z pliku, skoro i tak będziesz używał jednej funkcji?
Jak chcesz mieć % wynik podobieństwa, to funkcja ta zwraca liczbę od 0 do sumy znaków porównywanych tekstów.
Czyli tekst A: "marek", tekst B: "amrek" da wynik 1. Znaków w ciągach jest w sumie 10.
Co daje podobieństwo (1 - (1/10))*100 = 90%. |
_________________
|
|
|
|
|
Amaranthus
Starszy szeregowy
Główny edytor:
Drugi edytor:
Posty: 11
192 Prestiż
|
Wysłany: 09-10-2017, 17:49
|
|
|
Link do filmiku
Skąd Lua bierze skrypt, jak nie z pliku? Przecież raczej nie korzystają z jakiejś "bazy" gotowych funkcji wubodwanych w Lua. |
|
|
|
|
Wackyjackie
Bohater Starszy Chorąży Sztabowy Randomu
Główny edytor:
Drugi edytor:
Pojedynki: nie
Pomógł: 69 razy Posty: 717
36331 Prestiż
|
|
|
|
|
Amaranthus
Starszy szeregowy
Główny edytor:
Drugi edytor:
Posty: 11
192 Prestiż
|
Wysłany: 09-10-2017, 18:18
|
|
|
Jezus Maria, okazało się, że po prostu miałem niezaktualizowany xLua i on nie miał zapisu wewnętrznego kodu wbudowanego, zaktualizowałem i już naprawione. Przepraszam, że zwątpiłem, dziękuję Temat do zamknięcia! |
|
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
|