Wykorzystanie sztucznych sieci neuronowych do klasyfikacji tekstu?

Wykorzystanie sztucznych sieci neuronowych do klasyfikacji tekstu?
exevan
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 3 lata
  • Postów:21
0

Witam serdecznie. Jestem na 3 roku studiów (kierunek Informatyka), więc zbliża się moment napisania i oddania pracy dyplomowej. Pracuje od prawie 2 lat jako programista C# .NET w branży zajmującej się monitorowaniem i analizy ofert w E-Commerce. To tak kilka słów o mnie dlaczego to wybrałem.
Moim pomysłem na taką pracę dyplomową jest wykorzystanie sieci neuronowych w celu identyfikacji atrybutów wystawianych produktów w sklepach. Od razu wspomnę, że rozwiązaniem na ten problem są proste wyrażenia regularne, ale zaraz pokażę przykład.
Weżmy na tapetę na przykład jakąś oponę. Opony zapisuję się w następujący sposób: [Szerokość]/[Profil] R[Średnica] [Indeks nośności] [Indeks prędkości], np. 205/55 R16 91V

Można zauważyć pewien wzorzec i jak wspomniałem dobrym sposobem są wyrażenia regularne, ale zdarzają się przypadki gdzie rozmiary takiej opony są zapisane w całkiem inny sposób, np.:

  • 265 / 40 / R19 / 102Y
  • 265 / 40 / ZR19 / 102(Y)
  • 225/45 R18 95Y

Wzorzec mniej więcej jest zachowany czyli kolejność wpisanych atrybutów jest zgodna więc wyrażenia regularne do tego momentu jeszcze działają. Jednak w momencie, gdy w modelu opony również są 3 cyfry to wszystko przesuwa się o 1 jednostkę w lewo i już są dane błędnie sklasyfikowane. Są tez przypadki że nie ma podanej jednej wartości, albo nie są podane pokolei (91V 205/55/16).
Do nauczenia takiej sieci mam ogrom danych wejściowych tak więc to nie jest problem. Problem pojawia się w momencie gdy myślę o tym czy jest to w ogóle do napisania. Jakie rodzaje sieci neuronowych są w stanie pracować z tekstem - jak to wygląda? Jak nauczyć sieć gdy w momencie podania jakiegoś tekstu do sieci wypluje mi kilka sklasyfikowanych atrybutów?
Człowiek po jednym przykładzie jest w stanie nauczyć się rozpoznawania konkretnych wartości z tekstu, wystarczyło, że podałem wzorzec zapisywania rozmiaru opon. Przykład:

265 / 40 / R19 / 102Y => 265(szerokość); 40(profil) ; 19(średnica) ; 102 (indeks nośności) ; V(indeks prędkości).

Oczywiście taka sieć nie była by tylko to klasyfikowania opon, ale do wszelkich produktów.

Czy jest możliwość napisania takiej sieci pod taki problem, czy jest sens pisania takiej pracy inżynierskiej (chciałbym to móc wykorzystać w aktualnej pracy przy aktualnych projektach).

Czytałem kiedyś o tym sporo i znalazłem kilka metod:

  • Euclidean, Manhattan i Cosine Distance
  • Jaccard similarity
  • Bag of word
  • TF-IDF
  • SVM
  • Naive Bayes Classifier

Jednak czy to są w ogóle sieci? Czy tylko elementy z których taka sieć powinna korzystać przy pracy z tekstem. Dlatego piszę ten wątek bo może ktoś miał podobny problem do mojego i jest w stanie cokolwiek powiedzieć.

Dziękuję za wszelkie informacje. Pozdrawiam

edytowany 1x, ostatnio: exevan
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1
  1. Sieć neuronowa to sie do tego nadaje jak pięść do nosa. W ogóle NN nadają się do niewielu rzeczy w praktyce ;)
  2. Ale w zasadzie co ty chcesz klasyfikować? Bo póki co zasugerować jak regexami wyciągnąć parametry. Ty chcesz zarobić jakieś AI do ekstrakcji informacji? Obawiam sie że nijak nie da sie tego zrobić, szczególnie że chciałbyś:

Oczywiście taka sieć nie była by tylko to klasyfikowania opon, ale do wszelkich produktów.

:D
3.

Euclidean, Manhattan i Cosine Distance
Jaccard similarity
Bag of word
TF-IDF
SVM
Naive Bayes Classifier

To są wszystko metody zwiazane z przetwarzaniem języka naturalnego / text miningiem, ale z sieciami nic wspólnego nie mają a i do twojego problemu nijak się nie nadają. TF-IDF może ci wyciągnąć słowa kluczowe z tekstu a Jaccard / consine similarity mogą ci powiedzieć jak podobne do siebie są dwa teksty. BoW to tylko sposób wektorowej reprezentacji tekstu, a Naive Bayes Classifier to jest klasyfikator jak sama nazwa wskazuje. Na podstawie parametrów mógłby ci powiedzieć na przykład do jakiego samochodu pasują dane opony albo kto jest ich producentem ;]

Jak nauczyć sieć gdy w momencie podania jakiegoś tekstu do sieci wypluje mi kilka sklasyfikowanych atrybutów?

Odnosze wrażenie że ty nie bardzo rozumiesz co to jest klasyfikacja. Klasyfikacja to jest przypisanie klasy na podstawie atrybutów.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
exevan
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 3 lata
  • Postów:21
0

Dlatego zadałem pytanie czy SNN to w ogóle ten rodzaj rozwiązania takiego problemu. Te wszystkie metody które wypisałem to właśnie czytając o text miningu tak jak wspomniałeś. I tak, źle zrobiłem wypisując te wszystkie punkty bo wiem, że TF_IDF i Bag of word korzysta się w metodach. Generalnie z tego korzystają inne metody. Co do klasyfikacji i tego cytatu: można słowo "sklasyfikowanych" usunąć :D nie pasuje tam. Jednak chodzi mi o sam motyw problemu i czy da radę takie coś napisać, co wykorzystać.

edytowany 2x, ostatnio: exevan
mariano901229
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Postów:597
0

Jeżeli analizujesz jakieś oferty sprzedażowe to możesz wykorzystać metody data mining'u jak klasyfikacja to zbuduj sobie bazę klientów i na podstawie takich danych ich konkretnych cech możesz dokonać klasyfikacji - grupę klientów którzy kupili coś tam albo nie . Można też wykorzystać analizę skupień i pogrupować klientów np: bardzo dochodowi, słabo dochodowi etc. Można stworzyć reguły asocjacyjne np. klient kupując opony kupił również płyn do mycia felg. To tylko proste nawet nieco naiwne przykłady pod jakie możesz podpiąć swoją pracę z pracą dyplomową. Wg mnie jest tu całkiem szerokie pole do popisu. Jednakże musisz uzyskać jakąś podstawę bo póki co to tak jakbyś napisał "potrzebuję skosić trawnik, który czołg kupić ?".

exevan
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 3 lata
  • Postów:21
0

Analizuje oferty mniej więcej w taki sposób jak działa Ceneo. Czyli szukając na Ceneo jakiś produktów bardzo często pojawiają się w proponowanych takie same produkty, tyle że z innych sklepów. Aby znać takie produkty "proponowane" musiałbym skądś wiedzieć czy dany produkt jest taki sam lub bardzo podobny. Jednym sposobem jest to co pisałem czyli spróbowanie wynaleźć i zapisać dla jakiegoś produktu konkretne cechy, takie jak producent, model czy jakieś szerokości, rozmiary itd. Wtedy mając dwa produkty z tymi samymi cechami jesteśmy w stanie znaleźć produkty podobne tak jak działa Ceneo. Da się gdzieś tu wykorzystać takie metody SSN lub text mining po nazwach produktów? Może ktoś się spotkał z takim problemem i jest w stanie mi trochę pomóc? To co pisałeś bardziej pasuje pod jakiegoś Sales managera albo price manager, który na podstawie rózżnych statystyk jest w stanie powiedzieć bardzo dużo. Między innymi to co wymieniłeś.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

To jest zupełnie inna bajka bo ceneo bierze info o produktach ze źródeł ustrukturalizowanych (jak np. sklepy). Tam masz jasny format danych i możesz to parsować choćby regexami, a często udostępniane też jest odpowiednie API. Jedyne do czego sie tu przydaje ML to proponowanie podobnych poduktów.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
exevan
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 3 lata
  • Postów:21
0

Jak to w końcu jest Shalom. Znalazłem na stacku taką informacje pewnego użytkownika.

We have established that traditional ANNs are not really suitable for analyzing text. The underlying explanation for why this is so is based around the idea that ANNs operate on inputs that are generally a continuous range of values and the nearness of two values for an input means some sort of nearness in their meaning. Words do not have this idea of nearness and so, there's no real numerical encoding for words that can make sense as input to an ANN.

On the other hand, a solution that might work is to use a more traditional semantic analysis which could, perhaps produce sentiment ranges for a list of topics and then those topics and their sentiment values could possibly be used as input for an ANN.

Tradycyjne sieci neuronowe może i nie są stworzone do analizy tekstu, ale jakieś mądre znormalizowanie tekstu do wartości spowoduje to że jesteśmy w stanie wrzucić je jako wejście sieci neuronowej.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No ale to jest wtedy znowu ZUPEŁNIE co innego. Jasne że jak sobie policzysz np. sentyment dla zbioru tekstów to masz wartość liczbową i możesz na jej podstawie klasyfikować coś! Analogicznie jak zrobisz topic modeling na zbiorze tekstów i potem z ewaluacji modelu wyjdzie ci w jakim stopniu dany tekst realizuje różne tematy to możesz te wartości liczbowe wrzucić do sieci neuronowej która będzie to jeszcze dalej w jakiś sposób przerabiać.

Ale to nie ma absolutnie nic wspólnego z tym o czym pisałeś. Ani topic modeling ani liczenie sentymentu nijak sie ma do mądre znormalizowanie tekstu do wartości . To już jest samo w sobie zastosowaniem uczenia maszynowego/sztucznej inteligencji do analizy tekstu!

Mam wrażenie że ty w ogóle nie rozumiesz o czym czytasz.

  1. Analiza sentymentu to szacowanie jak pozytywne/negatywne są teksty. Mógłbyś w ten sposób analizować komentarze na onecie albo twittera i oceniać które są pozytywne a które negatywne.
  2. Topic modeling / analiza semantyczna pozwalają określić "tematykę" tekstu. Więc mógłbyś przeskanować wszystkie ogłoszenia na allegro i np. automatycznie pogrupować je na odnoszące się do samochodów, komputerów itd.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
0

Wydaje mi się że rozumiem w czym problem, ale nie wiem jak pomóc ;)

Też się zastanawiałem, jak niektóre produkty w ceneo, skapiec, nokaut i innych mają zupełnie różne opisy - jak można stwierdzić czy produkty w różnych sklepach to dokładnie te same produkty ?

Przykładowo kamery foto: W prawie każdym sklepie w temacie są opisane w różny sposób i wielokrotnie jest tak, ze ciężko jest sprawdzić czy sklep sprzedaję kamerę np. Nikon D5500 czy torbę, filtr, baterie, zasilacz,...<lub 200 innych akcesoriów do tego modelu> do Nikona D5500. Można oczywiście porównać cenę, jak się różni więcej niż np. 20% to "raczej" są to różne produkty, itd. Ale to średni pomysł :) Poza tym po opisach produktu, też jest bardzo ciężko rozpoznać (jedne mają full opis inne wręcz szczątkowy lub wcale). Sprawę jeszcze komplikują dodatki, "gratisy" czy sprzedaż w różnych wersjach, wariantach.

Wiem, ze ceneo, skapiec, nokaut też sobie do końca z tym problemem nie radzą, bo często sprzęt elektroniczny jest źle pogrupowany, nie mówiąc już o sprzęcie mniej popularnym (jak np. procesory serwerowe, szafy RACk, itp.).

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)