Baza typu encyklopedia i odmiana słów

0

Witajcie

Wyobraźcie sobie ... encyklopedię ... nie jest ważne, że służy do generowania skryptów dla pewnej gry RPG i nie jest (w tej chwili) ważny czynnik jakim jest przepisanie całości z bazy plikowej (własny format - podobny do XML) na MySQL oraz to, że przepisuję apke obsługującą (dwie apki) z Embarcadero na Lazarusa.

Ogólnie baza ma 37 tabel encyklopedycznych (~11k wpisów) i kilka tabel użytkowników (autorzy, uprawnienia i takie tam)

Pojawił się problem odmiany nazw oraz ich "ogarniania" we wpisach. Dotychczas główne słowo encyklopedii oraz jego (ewentualna nazwa) była zapisana w formacie "dziwnym" i dopiero "parser" (część apki) tego formatu tworzył tablice (w pamięci podręcznej) z tekstu, np: "Przełęcz Baszynów;/Przełęcz Baszynowska;/Przełęczy Baszynowskiej;/Przełęcz Baszynowską"

Jak sami widzicie, był to głupi pomysł bo wymagał od autorów "trzymania" się kolejności odmian. Teraz chcę zrobić z tego osobną tablicę, także ze względu, że konstruuję (a przynajmniej chcę ;) ) by, jeżeli pojawią się słowa ze słownika w opisie "czegoś" to automatycznie ma się pojawić odnośnik do danych encyklopedycznych - dotychczas trzeba to było robić ręcznie). Chwilowo rozważam "crona" który co jakiś czas "przelatuje" opisy i uzupełnia je od odpowiednie odnośniki.

Czyli jeżeli ktoś napiszę w jakimkolwiek tekście (wpis encyklopedyczny, notatki, listo do innego autora - apka ma taką możliwość) np "Przechodząc przez Przełęcz Baszynowską dotrzemy do Gór sowich to (o ile takie słowa wystąpią w bazie) słowa "Przełęcz Baszynowską" czy "Gór sowich" będą odnośnikami do właściwych im wpisów w encyklopedii.

Jak to rozsądnie zrobić?

  • odmiany wyrazów encyklopedycznych
  • parser opisów i definicji generujący linki do wyrażeń niezależnie od ich odmiany

nie chodzi tu o program a ogólne założenia - z uwzględnieniem, że rozpoczynają się przymiarki do tłumaczenia na angielski.

Poradźcie

Pozdrawiam

4

był to głupi pomysł bo wymagał od autorów "trzymania" się kolejności odmian

A czemu mieli wpisywać te słowa w określonej kolejności? Chyba czegoś tutaj nie rozumiem.

Ogólnie to najprościej by było to ogarnąć osobną tabelą - słownikiem. Miałaby ona 3 kolumny - ID, postać i odnośnik. I na przykładzie podanym przez Ciebie powyżej to bym tak widział:

ID postać odnośnik
1 Przełęcz Baszynów 458
2 Przełęcz Baszynowska 458
3 Przełęczy Baszynowskiej 458
4 Przełęcz Baszynowską 458

I teraz masz podane różne postacie wyrażenia, które posiada w jakiejś innej tabeli (np. w zestawieniu artykułów czy tematów) ID 458.

Od razu przychodzą mi do głowy trzy przemyślenia/sposoby skorzystania z tego:

  • jak ktoś wpisze w szukajkę którąkolwiek z w/w postaci, od razu wiesz, że odnosi się ona do artykuły/wpisu o ID 458, czyli dotyczącego tej przełęczy
  • parser może przemielić tekst artykułu i jeśli znajdzie jakąkolwiek z w/w postaci, to może ją podmienić na link w postaci encyklopedia.pl/artykul/458
  • dając zapytanie w stylu SELECT * FROM slownik WHERE odnosnik=458 uzyskasz listę wszystkich form/odmian dla danego hasła.

Jeszcze odnośnie drugiego myślnika - wydaje mi się, że ze względów wydajnościowych, artykuł powinien być parsowany tylko jeden raz - po jego dodaniu (oraz update po jego edycji lub po zmianie tabeli ze słowami kluczowymi - wzór której podałem powyżej), bo robienie tego za każdym razem podczas wyświetlania artykułu by niepotrzebnie obciążało serwer.

No i oczywiście to, co napisałem to tylko taki ogólny schemat/wzór, trzeba dopasować to do Twoich konkretnych potrzeb. Ale chciałem pokazać w jaki sposób ja bym podszedł do tematu.

1

@cerrato: Dziękuję za odpowiedź i sugestie.

A czemu mieli wpisywać te słowa w określonej kolejności? Chyba czegoś tutaj nie rozumiem.
Jak już pisałem to był głupi pomysł "sklecony" na szybko ze dwa lata temu i zapomniany.

  • Chwilowo przygotowałem tabelę dla rzeczowników z odmianą przez przypadki (mianownik dopełniacz itd)
    wygląda dobrze.

Druga sprawa jednak nie będzie taka prosta, bo każdy wpis autorów musi zostać "przeleciany" w obie strony czyli przeszukać bazę czy we wpisywanym tekście występuje już któreś ze słów z bazy i ... czy wpisywana fraza nie występuje czasem w którymś z tekstów.

Zobaczymy jak mi pójdzie, póki co na tapecie jest odmiana.

0

Co do przeszukiwania tekstu na występowanie słów, to w samym tekście pragnę zwrócić uwagę na wyszukiwanie całych słów, czyli przed pierwszą i za ostatnią literą musi być inny znak niż litera bądź początek/koniec tekstu. Myślę, że można to ogarnąć za pomocą regex, ale nie wiem, jak to wydajnościowo wyjdzie, trzebaby zrobić próbę. Prosty przykład: Szukane słowo to "enter", przy zwykłym wyszukiwaniu ciągu znaków znajdzie teksty niezawierające słowa "enter", ale zawierające słowa "entertainment".

A jak chodzi o odmiany, to jak zrobisz tak, jak proponuje cerrato, to wpiszesz "Przełęcz Baszynów" i zrobisz zapytanie
SELECT postac FROM slownik WHERE odnosnik in (SELECT odnosnik from slownik where postac = 'Przełęcz Baszynów'), w wyniku którego otrzymasz listę słów (ciągów znaków) i należy znaleźć teksty, w których występuje co najmniej jedno z tych słów. Proponuję konstrukcję z in zamiast = z tego powodu, że w ogólnym przypadku (nie wiem, jak będzie w Twoim) to samo słowo może mieć kilka znaczeń, a odmiana może się różnić w zależności od znaczenia, na przykład:

  1. Zamek: nie ma zamka, nie ma zamku
  2. Klient: są klienci i są klienty
  3. Ucho: uszy i ucha

Zastosowanie top 1 w celu wyeliminowania więcej niż jednej pozycji w odpowiedzi na podzapytanie może spowodować pominięcie pewnych form odmiany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1