2012-03-06 16 views
8

Niedawno zacząłem pracować z ontologiami i używam Protege do budowy ontologii, którą chciałbym również użyć do automatycznej klasyfikacji ciągów. Poniżej przedstawiono bardzo podstawowe klasy Hierarchia:Oparta na ontologii klasyfikacja ciągów

String 
|_ AlphabeticString 
    |_ CountryName 
    |_ CityName 
|_ AlphaNumericString 
    |_ PrefixedNumericString 
|_ NumericString 

Ostatecznie struny jak Spain należy zakwalifikować jako CountryName lub UE4564 byłoby PrefixedNumericString.

Jednak nie jestem pewien, jak modelować tę wiedzę. Czy muszę najpierw zdefiniować, czy znak jest alfabetyczny, numeryczny itp., A następnie skonstruować słowo z istniejących znaków, czy istnieje sposób na użycie Regeksów? Do tej pory udało mi się tylko sklasyfikować ciągi na podstawie dokładnej frazy, takiej jak String and hasString value "UE4565".

A może lepiej byłoby zabezpieczyć wyrażenie regularne dla każdej klasy w ontologii, a następnie sklasyfikować ciąg znaków w Javie, korzystając z tych wyrażeń regularnych?

Odpowiedz

2

Nie wiem nic na temat Protege, ale można użyć wyrażenia regularnego, aby dopasować większość tych przypadków. Jedynym problemem byłoby rozróżnienie nazwy kraju od miasta, nie widzę sposobu, w jaki można to zrobić bez pełnej listy.

Oto kilka wyrażeń, które można użyć:

  • AlphabeticString:

    ^[A-Za-z]+\z (ASCII) lub ^\p{Alpha}+\z (Unicode)

  • AlphaNumericString:

    ^[A-Za-z0-9]+\z (ASCII) lub ^\p{Alnum}+\z (Unicode)

  • PrefixedNumericString:

    ^[A-Za-z]+[0-9]+\z (ASCII) lub ^\p{Alpha}+\p{N}+\z (Unicode)

  • NumericString:

    ^[0-9]+\z (ASCII) lub ^\p{N}+\z (Unicode)

+0

Ciąg może być zarówno nazwą miasta, jak i nazwą kraju (dobrze, koncepcyjnie w oparciu o podane fakty). Ontologia nie musi mieć jednego dziedziczenia. –

2

określony ciąg znaków jest instancja, więc będziesz potrzebować jakiegoś kodu, aby wprowadzić podstawowe twierdzenia dotyczące konkretnej sytuacji postawa. Sam ten kod może zawierać użycie wyrażeń regularnych. Gdy uzyskasz te twierdzenia, będziesz mógł użyć swojej ontologii, aby się o nich dowiedzieć.

Najtrudniejsze jest to, że musisz zdecydować, na jakim poziomie chcesz się wzorować. Na przykład, czy będziesz mówić o poszczególnych postaciach? Możesz, ale niekoniecznie jest to rozsądne. Masz również wyzwanie, które wynika z faktu, że informacje są niezręczne (ponieważ podstawowym modelem takich modeli jest intuicjonistyczny, IIRC), co oznacza (na przykład), że wiesz, że ciąg zawiera znak liczbowy ale nie to, że jest czysto numeryczne. Tak, wiesz, że nie masz zapewnień, że instancja zawiera literę, ale nie wiesz, czy to dlatego, że ciąg nie ma jednego, czy tylko dlatego, że nikt jeszcze tak nie powiedział. Te rzeczy są trudne!

O wiele łatwiej jest napisać ontologię, jeśli dokładnie wiesz, jakie problemy zamierzasz z nią rozwiązać, ponieważ pozwala ci to przynajmniej ustalić, jakie fakty i relacje potrzebujesz, aby ustalić. W końcu istnieje cały świat możliwych rzeczy, które można by powiedzieć, które są prawdziwe, ale nieistotne ("jeśli słońce ma włączony kapelusz, on będzie wychodził do gry").

6

Podejście, które może być odpowiednie tutaj, zwłaszcza jeśli ontologia jest duża/skomplikowana lub może się zmienić w przyszłości, i zakładając, że niektóre błędy są akceptowalne, jest uczenie maszynowe.

Zarys procesu wykorzystującego takie podejście może być:

  1. Zdefiniuj zestaw funkcji można wyodrębnić z każdej struny, odnoszące się do ontologii (niektóre przykłady poniżej).
  2. Zbierz "zestaw pociągów" ciągów i ich prawdziwe dopasowania kategorii.
  3. Wyciągnij cechy z każdego ciągu i wytrenuj algorytm uczenia maszynowego na tych danych.
  4. Skorzystaj z przeszkolonego modelu, aby sklasyfikować nowe ciągi.
  5. Uaktualnij lub zaktualizuj swój model w razie potrzeby (np. Po dodaniu nowych kategorii).

Aby zilustrować bardziej konkretnie, oto kilka sugestii na podstawie przykładu z twojej ontologii.

Niektóre funkcje boolowskie, które mogą mieć zastosowanie: czy ciąg znaków pasuje do wyrażeń regularnych (np. Sugeruje te, które sugeruje Qtax); czy ciąg istnieje na wcześniej zbudowanej znanej liście nazw miast; czy istnieje na znanej liście nazw krajów; istnienie wielkich liter; długość struny (nie boolean), itp.

Tak więc, na przykład, masz w sumie 8 funkcji: dopasuj do 4 wyrażeń regularnych wymienionych powyżej; i dodatkowe 4 sugerowane tutaj, następnie "Hiszpania" byłaby reprezentowana jako (1,1,0,0,1,0,1,5) (pasujące do pierwszych 2 wyrażeń regularnych, ale nie do dwóch ostatnich, to nazwa miasta, ale nie nazwa kraju, ma wielką literę i długość to 5).

Ten zestaw funkcji będzie reprezentował dowolny podany ciąg.

do szkolenia i testowania algorytmu uczenia maszynowego, można użyć WEKA. Zacznę od algorytmów opartych na regułach lub drzewach, np. PART, RIDOR, JRIP lub J48.

Następnie wyszkolone modele mogą być używane przez Weka z poziomu Java lub jako zewnętrzna linia poleceń.

Oczywiście proponowane przeze mnie funkcje mają niemal 1: 1 związek z twoją ontologią, ale zakładając, że twoja taksonomia jest większa i bardziej złożona, takie podejście byłoby prawdopodobnie jednym z najlepszych pod względem opłacalności.

+0

To była najlepsza odpowiedź, którą przeczytałem od jakiegoś czasu! W rzeczywistości było tak dobrze, że teraz chcę to wypróbować dla siebie. Dzięki, Etov –

1

Odpowiadając bezpośrednio na twoje pytanie, zaczynasz od sprawdzenia, czy dany token jest numeryczny, alfanumeryczny czy alfabetyczny (możesz użyć tutaj regex), a następnie sklasyfikujesz go jako taki. Ogólnie rzecz biorąc, podejście, którego szukasz, nazywa się hierarchią generalizacji tokenów lub hierarchicznym wyborem funkcji (Google it). Podstawową ideą jest to, że możesz traktować każdy token jako osobny element, ale to nie jest najlepsze podejście, ponieważ nie możesz ich wszystkich zakryć [*]. Zamiast tego używasz typowych funkcji wśród tokenów (na przykład 2000 i 1981 to odrębne tokeny, ale mają one wspólną cechę: 4 cyfry i ewentualnie lata).Następnie masz klasę dla liczb czterocyfrowych, inną dla alfanumerycznych i tak dalej. Ten proces generalizacji pomaga uprościć podejście do klasyfikacji.

Często, jeśli zaczynasz od ciągu żetonów, musisz je przetworzyć (np. Usunąć interpunkcję lub specjalne symbole, usunąć słowa, które nie są istotne, wyniki itd.). Być może jednak możesz użyć niektórych symboli (np. Interpunkcja między miastami i krajami - np. Melbourne, Australia), więc przypisz ten zestaw przydatnych znaków interpunkcyjnych do innego symbolu (#) i użyj go jako kontekstu (aby następnym razem znaleźć nieznany słowo obok przecinka obok znanego kraju, możesz użyć tej wiedzy, aby założyć, że nieznane słowo jest miastem

Tak czy inaczej, to ogólna idea klasyfikacji za pomocą ontologii (na podstawie taksonomii terminów). można też przeczytać o part-of-speech tagging.

Nawiasem mówiąc, jeśli tylko chce mieć 3 kategorie (numeryczne, alfanumeryczne, alfabetyczna), realną opcją byłoby użyć edit distance (co jest bardziej prawdopodobne, że UA4E30 należeć s do kategorii alfanumerycznej lub numerycznej, biorąc pod uwagę, że nie odpowiada tradycyjnemu formatowi wcześniejszych ciągów liczbowych?). Przyjmujesz więc koszt każdej operacji (wstawiania, usuwania, subtytucji), która przekształca nieznany token w znany.

Wreszcie, chociaż powiedziałeś, że używasz Protege (którego nie używałem) do zbudowania twojej ontologii, możesz spojrzeć na WordNet.

[*] Istnieją podejścia probabilistyczne, które pomagają określić prawdopodobieństwo nieznanego tokena, więc prawdopodobieństwo wystąpienia takiego zdarzenia nie wynosi zero. Zwykle odbywa się to w kontekście Ukrytych modeli Markowa. W rzeczywistości może to być przydatne do poprawy sugestii podanej przez etov.

Powiązane problemy