Zauważ, że robię wszystko w R.
Problem wygląda następująco:
Zasadniczo mam listę CV (CV). Niektórzy kandydaci będą mieli wcześniej doświadczenie zawodowe, a niektórzy nie. Celem jest tutaj: na podstawie tekstu w życiorysach chcę podzielić je na różne sektory pracy. Zwłaszcza w tych przypadkach, w których kandydaci nie mają doświadczenia / są studentami i chcę dokonać prognozy, aby sklasyfikować sektory pracy, do których kandydat najprawdopodobniej będzie należeć po ukończeniu studiów.
Pytanie 1: Znam algorytmy uczenia maszynowego. Jednak nigdy wcześniej nie robiłem NLP. Natknąłem się na alokację Latent Dirichlet w Internecie. Nie jestem jednak pewien, czy jest to najlepsze podejście do rozwiązania mojego problemu.
Mój oryginalny pomysł: uczyń to nadzorowanym problemem uczenia się . Załóżmy, że mamy już dużą ilość oznaczonych danych, co oznacza, że poprawnie oznaczyliśmy sektory pracy dla listy kandydatów. Szkolimy model przy użyciu algorytmów ML (tj. Najbliższego sąsiada ...) i wprowadzamy te nieoznakowane dane , które są kandydatami, którzy nie mają doświadczenia zawodowego / są studentami, i próbujemy przewidzieć, do którego sektora pracy będą należeć.
Zaktualizuj pytanie 2: czy dobrym pomysłem byłoby utworzenie pliku tekstowego poprzez wyodrębnienie wszystkiego z CV i wydrukowanie tych danych w pliku tekstowym, aby każde CV było powiązane z plikiem tekstowym, który zawiera nieustrukturyzowane ciągi, a następnie zastosował techniki eksploracji tekstu w plikach tekstowych i sprawił, że dane zostały ustrukturyzowane, a nawet w celu stworzenia matrycy częstotliwości terminów używanych z plików tekstowych? Na przykład plik tekstowy może wyglądać mniej więcej tak:
I deployed ML algorithm in this project and... Skills: Java, Python, c++ ...
To właśnie miałem na myśli przez „nieustrukturyzowany”, tj. Zwinięcie wszystkiego w ciąg jednego wiersza.
Czy to podejście jest złe? Popraw mnie, jeśli uważasz, że moje podejście jest złe.
Pytanie 3: Trudna część: jak zidentyfikować i wyodrębnić słowa kluczowe ? Korzystasz z tm
pakietu w R? na jakim algorytmie opiera się tm
pakiet? Czy powinienem używać algorytmów NLP? Jeśli tak, na jakie algorytmy powinienem spojrzeć? Wskaż mi też kilka dobrych zasobów, na które warto spojrzeć.
Wszelkie pomysły byłyby świetne.
źródło
Po prostu wyodrębnij słowa kluczowe i wytrenuj na nich klasyfikator . To wszystko naprawdę.
Większość tekstu w CV nie jest tak naprawdę związana z umiejętnościami. Np. Rozważ zdanie „Mam doświadczenie i jestem bardzo wydajny w Javie”. Tutaj tylko 1 na 7 słów to nazwa umiejętności, reszta to tylko hałas, który obniży twoją dokładność klasyfikacji.
Większość CV nie jest tak naprawdę ustrukturyzowana. Lub zbyt swobodnie ustrukturyzowany. Lub użyj nietypowych nazw dla sekcji. Lub formaty plików, które nie zachowują struktury po przetłumaczeniu na tekst. Mam doświadczenie w wydobywaniu dat, godzin, nazwisk, adresów, a nawet intencji ludzi z nieuporządkowanego tekstu, ale nie ma listy umiejętności (ani uniwersytetu, ani niczego innego), nawet nie bardzo blisko.
Więc po prostu tokenizuj (i ewentualnie twórz ) swoje CV, wybieraj tylko słowa ze wstępnie zdefiniowanej listy (możesz użyć LinkedIn lub czegoś podobnego, aby pobrać tę listę), utwórz wektor cech i wypróbuj kilka klasyfikatorów (np. SVM i Naive Bayes) .
(Uwaga: zastosowałem podobne podejście, aby sklasyfikować profile LinkedIn w ponad 50 klasach z dokładnością> 90%, więc jestem pewien, że nawet naiwne wdrożenie będzie działać dobrze).
źródło
To trudny problem. Istnieje wiele sposobów, aby sobie z tym poradzić. Sądzę, że wznowienia można traktować jako dokumenty częściowo ustrukturyzowane. Czasami dobrze jest mieć minimalną strukturę w dokumentach. Wierzę, że w CV można zobaczyć dane tabelaryczne. Możesz je traktować jako pary wartości atrybutów. Na przykład otrzymasz listę terminów dla atrybutu „Zestaw umiejętności”.
Kluczową ideą jest ręczne skonfigurowanie listy fraz kluczowych, takich jak „umiejętności”, „edukacja”, „publikacja” itp. Następnym krokiem jest wyodrębnienie terminów odnoszących się do tych fraz kluczowych, wykorzystując w jakiś sposób strukturę ( jako tabele) lub przez wykorzystanie bliskości terminów wokół tych kluczowych fraz, np. fakt, że słowo „Java” znajduje się w pobliżu terminu „umiejętność”, może wskazywać, że osoba jest biegła w języku Java.
Po wyodrębnieniu tych informacji następnym krokiem może być zbudowanie wektora funkcji dla każdej z tych kluczowych fraz. Następnie możesz przedstawić dokument jako wektor z różnymi polami (po jednym dla frazy kluczowej). Rozważmy na przykład następujące dwa CV reprezentowane przez dwie dziedziny, mianowicie projekt i edukację .
Doc1: {projekt: (java, 3) (c, 4)}, {edukacja: (komputer, 2), (fizyka, 1)}
Doc2: {project: (java, 3) (python, 2)}, {education: (matematyka, 3), (komputer, 2)}
W powyższym przykładzie pokazuję termin z częstotliwością. Oczywiście, podczas wyodrębniania terminów, musisz zablokować i usunąć słowa-stop. Z przykładów jasno wynika, że osoba, której życiorysem jest Doc1, jest bardziej wykwalifikowana w C niż w D2. Jeśli chodzi o implementację, w Lucene bardzo łatwo jest reprezentować dokumenty jako wektory polowe.
Kolejnym krokiem jest pobranie listy rankingowej wznowień ze względu na specyfikację zadania. W rzeczywistości jest to dość proste, jeśli reprezentujesz zapytania (specyfikacje zadania) również jako wektory pola. Wystarczy pobrać uporządkowaną listę kandydatów (CV) za pomocą Lucene z kolekcji indeksowanych CV.
źródło
Pracuję dla witryny z ofertami pracy online i tworzymy rozwiązania w celu rekomendowania ofert pracy na podstawie CV. Nasze podejście obejmuje tytuł zawodowy osoby (lub pożądany tytuł zawodowy, jeśli jest znany i znany studentowi), wraz z umiejętnościami, które wydobywamy z jego życiorysu, oraz jego lokalizację (co jest bardzo ważne dla większości ludzi) i na tej podstawie odnajdujemy pasujące stanowiska.
pod względem klasyfikacji dokumentów przyjąłbym podobne podejście. Poleciłbym obliczenie macierzy tf idf dla każdego CV jako standardowego modelu słów, wyodrębnienie tylko stanowiska pracy i umiejętności danej osoby (dla których musisz zdefiniować listę umiejętności do wyszukania) i umieszczenie jej w ML algorytm. Polecam wypróbowanie KNN i SVM, ten drugi działa bardzo dobrze z wysokowymiarowymi danymi tekstowymi. Liniowe SVM mają tendencję do radzenia sobie lepiej niż nieliniowe (np. Przy użyciu jąder RBf). Jeśli uzyskasz rozsądne wyniki, pobawiłbym się wypakowywaniem funkcji za pomocą parsera języka naturalnego / fragmentatora, a także niestandardowych fraz dopasowanych przez wyrażenia regularne.
źródło