NukeBoards - Kreatywność przede wszystkim
FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  DownloadDownload
RejestracjaRejestracja  ZalogujZaloguj

Odpowiedz do tematu
Poprzedni temat :: Następny temat
[MMF2] Sprawdzanie %towe zgodności tekstu
Autor Wiadomość
Amaranthus 
Starszy szeregowy


Główny edytor: MMF2 Dev
Drugi edytor: Unity
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: MMF2 Dev
Drugi edytor: Stencyl
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: MMF2 Dev
Drugi edytor: Unity
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 :D ), 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: MMF2 Dev
Drugi edytor: Stencyl
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: MMF2 Dev
Drugi edytor: Unity
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: MMF2 Dev
Drugi edytor: Stencyl
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 :P . 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: MMF2 Dev
Drugi edytor: Unity
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: MMF2 Dev
Drugi edytor: Stencyl
Pojedynki: nie
Pomógł: 69 razy
Posty: 717

36331 Prestiż
Wysłany: 09-10-2017, 18:01   

Kliknij Pan dwa razy na wtyczkę XLUA:
https://i.imgur.com/FbPckTy.png
_________________
 
 
     
Amaranthus 
Starszy szeregowy


Główny edytor: MMF2 Dev
Drugi edytor: Unity
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!
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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

Skocz do:  

PSK Cytaty Klikibaza - kopia wszystkich klików Klikipedia - encyklopedia o tworzeniu gier Discord KlikCzat Zaproszenie
Daj piniondza Wielkie Muzeum Klikowe

Powered by phpBB modified by Przemo © 2003 phpBB Group