NukeBoards

Pomoc - [MMF2] Sprawdzanie %towe zgodności tekstu

Amaranthus - 08-10-2017, 00:27
: Temat postu: [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 - 08-10-2017, 17: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 - 08-10-2017, 21: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 - 08-10-2017, 22: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 - 08-10-2017, 23: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 - 09-10-2017, 18: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 - 09-10-2017, 18: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 - 09-10-2017, 19:01
:
Kliknij Pan dwa razy na wtyczkę XLUA:
https://i.imgur.com/FbPckTy.png
Amaranthus - 09-10-2017, 19: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!