Jakich algorytmów należy użyć do przeprowadzenia klasyfikacji zadania na podstawie danych wznawiania?


28

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 tmpakietu 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.

Odpowiedzi:


14

Sprawdź ten link.

Tutaj poprowadzą Cię przez ładowanie nieuporządkowanego tekstu do utworzenia chmury słów. Możesz dostosować tę strategię i zamiast tworzyć chmurę słów, możesz stworzyć macierz częstotliwości używanych terminów. Chodzi o to, aby wziąć nieustrukturyzowany tekst i jakoś go ustrukturyzować. Zmieniasz wszystko małymi literami (lub dużymi literami), usuwasz słowa stop i znajdujesz częste terminy dla każdej funkcji zadania za pomocą Matryce terminów dokumentu. Masz również opcję ułożenia słów. Jeśli wyreżyserujesz słowa, będziesz w stanie wykryć różne formy słów jako to samo słowo. Na przykład „programowane” i „programowanie” można powiązać z „programowaniem”. Występowanie tych częstych terminów można dodać jako ważoną cechę w szkoleniu modelu ML.

Możesz także dostosować to do częstych fraz, znajdując wspólne grupy 2-3 słów dla każdej funkcji pracy.

Przykład:

1) Załaduj biblioteki i skompiluj przykładowe dane

library(tm)
library(SnowballC)

doc1 = "I am highly skilled in Java Programming.  I have spent 5 years developing bug-tracking systems and creating data managing system applications in C."
job1 = "Software Engineer"
doc2 = "Tested new software releases for major program enhancements.  Designed and executed test procedures and worked with relational databases.  I helped organize and lead meetings and work independently and in a group setting."
job2 = "Quality Assurance"
doc3 = "Developed large and complex web applications for client service center. Lead projects for upcoming releases and interact with consumers.  Perform database design and debugging of current releases."
job3 = "Software Engineer"
jobInfo = data.frame("text" = c(doc1,doc2,doc3),
                     "job" = c(job1,job2,job3))

2) Teraz wykonujemy strukturyzację tekstu. Jestem przekonany, że istnieją szybsze / krótsze sposoby na wykonanie następujących czynności.

# Convert to lowercase
jobInfo$text = sapply(jobInfo$text,tolower)

# Remove Punctuation
jobInfo$text = sapply(jobInfo$text,function(x) gsub("[[:punct:]]"," ",x))

# Remove extra white space
jobInfo$text = sapply(jobInfo$text,function(x) gsub("[ ]+"," ",x))

# Remove stop words
jobInfo$text = sapply(jobInfo$text, function(x){
  paste(setdiff(strsplit(x," ")[[1]],stopwords()),collapse=" ")
})

# Stem words (Also try without stemming?)
jobInfo$text = sapply(jobInfo$text, function(x)  {
  paste(setdiff(wordStem(strsplit(x," ")[[1]]),""),collapse=" ")
})

3) Utwórz źródło korpusu i matrycę terminów dokumentu.

# Create Corpus Source
jobCorpus = Corpus(VectorSource(jobInfo$text))

# Create Document Term Matrix
jobDTM = DocumentTermMatrix(jobCorpus)

# Create Term Frequency Matrix
jobFreq = as.matrix(jobDTM)

Teraz mamy macierz częstotliwości, jobFreq, czyli macierz (3 x x), 3 wpisy i X słów.

To, dokąd idziesz stąd, zależy od ciebie. Możesz zachować tylko określone (bardziej powszechne) słowa i używać ich jako funkcji w swoim modelu. Innym sposobem jest uproszczenie i użycie procentu słów w każdym opisie stanowiska, powiedzmy, że „java” miałoby 80% występowania w „inżynierze oprogramowania” i tylko 50% w „zapewnieniu jakości”.

Teraz nadszedł czas, aby sprawdzić, dlaczego „zapewnienie” ma 1 „r”, a „wystąpienie” ma 2 „r”.


Chciałbym zobaczyć twój przykład.
user1769197,

Zaktualizowany o szybki przykład.
nfmcclure

11

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).


Powiedzmy, że analizuję połączone dane. Czy uważasz, że dobrym pomysłem byłoby połączenie wcześniejszego doświadczenia zawodowego, rekomendacji edukacyjnych i umiejętności jednego profilu w jednym pliku tekstowym i wyodrębnienie z niego słów kluczowych?
user1769197,

LinkedIn ma teraz tagi umiejętności, które ludzie przypisują sobie, a inni użytkownicy mogą je poprzeć, więc w zasadzie nie trzeba ręcznie wyodrębniać słów kluczowych. Ale w przypadku mniej uporządkowanych danych - tak, pomocne może być scalenie wszystkiego, a następnie pobranie słów kluczowych. Pamiętaj jednak o głównej zasadzie: wypróbuj . Teoria jest dobra, ale tylko praktyczne eksperymenty z różnymi podejściami ujawnią najlepsze.
zaprzyjaźnij się

@ffriend, Jak uzyskać listę słów kluczowych?
NG_21

1
@ffriend Jaki jest najlepszy sposób na wyodrębnienie „doświadczenie” = „5 lat”, „Język” = „C” z następującego zdania. „Spędziłem 5 lat opracowując systemy śledzenia błędów i tworząc aplikacje systemowe do zarządzania danymi w C”. Użyłem Rake z NLTK i po prostu usunąłem stopword + interpunkcje, ale z powyższego zdania nie potrzebuję słów takich jak programowanie, śledzenie błędów, systemy, tworzenie, dane itp. Dzięki
Khalid Usman

3
@KhalidUsman: skoro już pracujesz z NLTL, spójrz na narzędzia do rozpoznawania nazwanych jednostek , szczególnie sekcję „Tworzenie porcji wyrażeń regularnych”. Ogólnie rzecz biorąc, chciałbyś użyć słownika słów kluczowych (np. „Lata”, „C” itp.) I prostego zestawu reguł (takich jak „zawiera„ C ”” lub „<liczba> lat”) w celu wyodrębnienia nazwanych podmiotów z dowolnego tekstu.
zaprzyjaźnij się

7

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.


Algorytm: co byś polecił?
user1769197

masz na myśli algorytm obliczania najbardziej podobnych wektorów wznowienia, biorąc pod uwagę wektor zadania zapytania? możesz użyć dowolnego standardowego algorytmu, takiego jak BM25 lub Model językowy ...
Debasis

Nigdy nie słyszałem o tych algorytmach. Czy te algorytmy NLP lub algo ML?
user1769197

są to standardowe modele pobierania ... model pobierania określa, jak obliczyć podobieństwo między dokumentem (wznowienie w twoim przypadku) a zapytaniem (zadanie w twoim przypadku).
Debasis

Nie mam wiedzy na temat wyszukiwania informacji, czy uważasz, że algorytmy uczenia maszynowego, takie jak klastrowanie / najbliższy sąsiad, również będą działać w moim przypadku?
user1769197

7

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.


Czy nadal używasz SVM, gdy masz 3 lub więcej klas? A jakie funkcje chcesz wyodrębnić za pomocą parsera języka naturalnego? W jakim celu ?
user1769197

Możesz trenować nvv dla n klas, stosując strategię jeden vs reszta. SciKitLearn ma kod do wykonania tego automatycznie. Technicznie potrzebujesz klasyfikatorów n-1, ale zauważyłem, że n działa lepiej.
Simon

@ Simon Czy potrafisz napisać pełne kroki dla tego systemu rekomendacji? Mam małe doświadczenie (wdrażanie pracy magisterskiej) w ML, ale zupełnie nowe w dziedzinie IR. Teraz pracuję nad tym systemem i napisałem następujące kroki. 1. Użyj NLTK do wyodrębnienia słów kluczowych, 2. Oblicz wynik dla słów kluczowych i fraz, 3. Stemmer, 4. Kategoryzacja (najtrudniejsze zadanie) i 5. Macierz częstotliwości, tf-idf lub algo BM25. Czy jestem na właściwej drodze do wdrożenia? Dzięki
Khalid Usman,

@KhalidUsman Nie mogę powiedzieć dokładnie, jak to działa, co może wpędzić mnie w kłopoty. Najłatwiejszym rozwiązaniem byłoby umieszczenie danych w Solr lub Elastic Search i użycie ich implementacji rekomendujących MLT. Bardziej wyrafinowanym podejściem jest wyodrębnianie kluczowych słów i fraz, przepychanie dokumentów przez LSA i wykonywanie k-nn na wynikowych wektorach. Następnie możesz użyć innych sygnałów, takich jak filtrowanie grupowe i ogólna popularność.
Simon

@ Simon, dzięki za wskazówki. Stosuję drugi sposób, wyodrębniłem słowa kluczowe / frazy za pomocą RAKE + NLTK, a następnie planowałem zastosować tf-idf lub BM25. Czy mam rację? Czy możesz trochę rozwinąć KNN, to znaczy, jak zastosować KNN do słów kluczowych, czy powinienem tworzyć słowa kluczowe jako funkcje? Dzięki
Khalid Usman,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.