PYTANIA
Jak stworzyć listę powiązanych słów na podstawie początkowych słów kluczowych?
Ostatnio widziałem fajną funkcję, która była kiedyś dostępna w Arkuszach Google: zaczynasz od napisania kilku powiązanych słów kluczowych w kolejnych komórkach, powiedz: „niebieski”, „zielony”, „żółty”, i automatycznie generuje podobne słowa kluczowe (w tym przypadku , inne kolory). Chciałbym to odtworzyć we własnym programie. Zastanawiam się nad użyciem Freebase i działałoby to intuicyjnie:
- Pobierz listę podanych słów w Freebase;
- Znajdź ich „wspólny mianownik (-y)” i na tej podstawie zbuduj metrykę odległości;
- Ranguj inne pojęcia na podstawie ich „odległości” od oryginalnych słów kluczowych;
- Wyświetl następne najbliższe pojęcia.
Ponieważ nie znam tej dziedziny, moje pytania są następujące:
Czy jest na to lepszy sposób?
Jakie narzędzia są dostępne dla każdego kroku?
ODPOWIEDZI
Algorytm word2vec może być dobrym sposobem na uzyskanie większej liczby elementów dla listy podobnych słów. Jest to nienadzorowany algorytm „głębokiego uczenia się”, który został wcześniej zademonstrowany przy użyciu danych szkoleniowych opartych na Wikipedii (skrypty pomocnicze są dostępne na stronie kodowej Google). Obecnie istnieją implementacje C i Python. Ten samouczek Radima Řehůřka, autora biblioteki modelowania tematów Gensim, jest doskonałym miejscem do rozpoczęcia. Demonstracja „jednego tematu” w samouczku jest dobrym przykładem przywracania podobnych słów do pojedynczego terminu (spróbuj wyszukać „czerwony” lub „żółty”). Powinno być możliwe rozszerzenie tej techniki, aby znaleźć słowa, które mają największe ogólne podobieństwo do zestawu słów wejściowych.
Czy rozważałeś podejście oparte na częstotliwości, wykorzystujące proste współwystępowanie słów w ciałach? Przynajmniej tego widziałem większość ludzi do tego. Myślę, że może to być krótko omówione w książce Manninga i Schütze, i wydaje mi się, że pamiętam coś takiego jak zadanie domowe z powrotem w szkole… Na tym etapie: uszereguj inne koncepcje na podstawie ich „odległości” od oryginalnych słów kluczowych; Istnieje kilka wskaźników podobieństwa semantycznego, które można sprawdzić. Oto link do niektórych slajdów, które przygotowałem dla projektu klasowego przy użyciu kilku takich wskaźników podobieństwa w WordNet
Uczenie się funkcji bez nadzoru dla NER
Wdrożyłem system NER z wykorzystaniem algorytmu CRF z moimi ręcznie wykonanymi funkcjami, które dawały całkiem dobre wyniki. Chodzi o to, że użyłem wielu różnych funkcji, w tym tagów POS i lematów. Teraz chcę zrobić ten sam NER dla innego języka. Problem polega na tym, że nie mogę używać tagów POS i lematów. Zacząłem czytać artykuły o głębokim uczeniu się i uczeniu się funkcji bez nadzoru. Moje pytanie brzmi, czy można zastosować metody uczenia funkcji bez nadzoru za pomocą algorytmu CRF. Czy ktoś próbował tego i uzyskał dobry wynik? Czy jest jakiś artykuł lub samouczek na ten temat. Nadal nie rozumiem w pełni tego sposobu tworzenia funkcji, więc nie chcę spędzać zbyt wiele czasu na czymś, co nie zadziała. Tak więc każda informacja byłaby naprawdę pomocna. Stworzenie całego systemu NER opartego na głębokim uczeniu się to na razie trochę za dużo. Z góry dziękuję.
Tak, można całkowicie połączyć uczenie się bez nadzoru z modelem CRF. W szczególności polecam zbadanie możliwości wykorzystania funkcji word2vec jako danych wejściowych do CRF. Word2vec ćwiczy rozróżnianie między słowami, które są odpowiednie dla danego kontekstu, a słowami, które są losowo wybrane. Wybrane wagi modelu można następnie interpretować jako gęstą reprezentację wektorową danego słowa. Te gęste wektory mają atrakcyjną właściwość, że słowa, które są semantycznie lub składniowo podobne, mają podobne reprezentacje wektorowe. Podstawowa arytmetyka wektorów ujawnia nawet kilka interesujących wyuczonych związków między słowami. Na przykład wektor („Paryż”) – wektor („Francja”) + wektor („Włochy”) daje wektor bardzo podobny do wektora („Rzym”). Na wysokim poziomie można uznać reprezentacje word2vec za podobne do reprezentacji LDA lub LSA, w tym sensie, że można przekształcić rzadki wektor wejściowy w gęsty wektor wyjściowy, który zawiera informacje o podobieństwie słów. W tym przypadku LDA i LSA są również ważnymi opcjami uczenia się funkcji bez nadzoru – zarówno próbują reprezentować słowa jako kombinacje „tematów”, jak i gęstą reprezentację słów. W przypadku tekstu w języku angielskim Google dystrybuuje modele word2vec wstępnie wyszkolone na ogromnym 100-miliardowym zestawie danych Google News, ale w przypadku innych języków musisz wyszkolić swój własny model.
Grupowanie ciągów wewnątrz ciągów?
Nie jestem pewien, czy poprawnie sformułowałem pytanie. Zasadniczo chcę: załóżmy, że mam listę 1000 ciągów, które wyglądają tak:
cvzxcvzxstringcvzcxvz
otortorotrstringgrptprt
vmvmvmeopstring2vmrprp
vccermpqpstring2rowerm
proorororstring3potrprt
mprto2435string3famerpaer
itp.
Chciałbym wyodrębnić te ponownie powtarzające się ciągi, które występują na liście. Jakiego rozwiązania powinienem użyć? Czy ktoś wie o algorytmie, który mógłby to zrobić?
Interesujące pytanie! Nie spotkałem się z tym wcześniej, więc oto rozwiązanie, które właśnie wymyśliłem, inspirowane podejściem przyjętym w dokumencie word2vec:
- Zdefiniuj pary podobieństwo na podstawie najdłuższego wspólnego podłańcucha (LCS) lub LCS znormalizowanego przez produkty o długości łańcucha. Buforuj to w macierzy dla każdej rozważanej pary ciągów, ponieważ jest to kosztowne do obliczenia. Weź również pod uwagę przybliżenia.
- Znajdź osadzenie euklidesowe (być może hipersferalne?), Które minimalizuje błąd (odległość euklidesowa w przypadku korzystania z kuli i iloczyn kropkowy w przypadku korzystania z kuli). Załóżmy losową inicjalizację i zastosuj metodę optymalizacji opartą na gradiencie, biorąc jakobian błędu.
- Teraz masz osadzanie przestrzeni Hilberta, więc klastruj, używając wybranego algorytmu! Odpowiedź pytanie, jak grupować wiele podciągów: większość złożoności leży w pierwszym etapie; obliczenia LCS, więc zależy to od tego, jak skutecznie to zrobisz. Miałem szczęście z algorytmami genetycznymi. W każdym razie to, co zrobiłbyś w tym przypadku, to zdefiniowanie wektora podobieństwa zamiast skalara, którego elementami są najdłuższe k-pary LCS; zobacz tę dyskusję dla algorytmów. Następnie zdefiniowałbym błąd przez sumę błędów odpowiadających każdemu podciągowi. Coś, o czym nie wspomniałem, to sposób wyboru wymiaru osadzania. Artykuł word2vec może dostarczyć pewnej heurystyki; zobacz tę dyskusję. Pamiętam, że używali dość dużych spacji, rzędu 1000 wymiarów, ale optymalizowali coś bardziej skomplikowanego, więc sugeruję zacząć od R ^ 2 i posuwać się w górę. Oczywiście, będziesz chciał zastosować wyższą wymiarowość dla wielu przypadków LCS.
Etyczne i ekonomiczne skalowanie skalowania danych
Niewiele rzeczy w życiu sprawia mi przyjemność, jak skrobanie uporządkowanych i nieustrukturyzowanych danych z Internetu i wykorzystywanie ich w moich modelach. Na przykład zestaw narzędzi Data Science Toolkit (lub RDSTK dla programistów R) pozwala mi pobrać wiele dobrych danych opartych na lokalizacji przy użyciu adresów IP lub adresów, a wtyczka tm.webmining.plug dla pakietu tm sprawia, że skrobanie danych finansowych i wiadomości jest proste. Kiedy wychodzę poza takie (częściowo) ustrukturyzowane dane, zwykle używam XPath. Jednak ciągle dławią mnie ograniczenia liczby zapytań, które możesz zadawać. Myślę, że Google ogranicza mnie do około 50 000 żądań na 24 godziny, co jest problemem dla Big Data.
Z technicznego punktu widzenia obejście tych limitów jest łatwe – wystarczy zmienić adresy IP i usunąć inne identyfikatory ze swojego środowiska. Jednak dotyczy to zarówno kwestii etycznych, jak i finansowych (tak myślę?). Czy istnieje rozwiązanie, które przeoczam?
W przypadku wielu interfejsów API (większość, które widziałem) ratelimiting jest funkcją twojego klucza API lub poświadczeń OAuth. (Google, Twitter, NOAA, Yahoo, Facebook itp.) Dobrą wiadomością jest to, że nie musisz sfałszować adresu IP, wystarczy wymienić dane uwierzytelniające, gdy osiągną limit prędkości. Trochę bezwstydnej autopromocji tutaj, ale napisałem specjalnie pakiet Pythona do radzenie sobie z tym problemem.
https://github.com/rawkintrevo/angemilner
https://pypi.python.org/pypi/angemilner/0.2.0
Wymaga demona mongodb i zasadniczo tworzysz stronę dla każdego ze swoich kluczy. Masz więc 4 adresy e-mail, każdy z osobnym kluczem. Po załadowaniu klucza określ maksymalną liczbę połączeń dziennie i minimalny czas między kolejnymi uruchomieniami.
Załaduj klucze:
z angemilner importuj APIKeyLibrarian
l = APIKeyLibrarian ()
l.new_api_key („twój_znaczony_klucz1”, „noaa”, 1000, .2)
l.new_api_key („twój_znaczony_klucz2”, „noaa”, 1000, .2)
Następnie po uruchomieniu skrobaczki, na przykład interfejsu API NOAA:
url = „http://www.ncdc.noaa.gov/cdo-web/api/v2/stations”
ładunek = {„limit”: 1000,
„datasetid”: „GHCND”,
„data rozpoczęcia”: „1999-01-01”}
r = requests.get (adres URL, parametry = ładunek, nagłówki = {‘token’: ‘twój_klucz_znacznika ”})
staje się:
url = „http://www.ncdc.noaa.gov/cdo-web/api/v2/stations”
ładunek = {„limit”: 1000,
„datasetid”: „GHCND”,
„data rozpoczęcia”: „1999-01-01”}
r = requests.get (adres URL, parametry = ładunek, nagłówki = {‘token’: l.check_out_api_key (‘noaa’) [‘key’]})
więc jeśli masz 5 kluczy, l.check_out_api_key zwraca klucz, który ma najmniejsze użycie i czeka, aż upłynie wystarczająco dużo czasu na jego ponowne użycie. Na koniec, aby zobaczyć, jak często Twoje klucze były używane / pozostały dostępny dostęp:
pprint (l.summary ())
Nie napisałem tego dla R, ponieważ większość skrobania odbywa się w Pythonie (większość MOJE skrobanie). Można go łatwo przenieść. W ten sposób można technicznie obejść ograniczenia stawek. Etycznie…
Wyodrębnij najbardziej pouczające części tekstu z dokumentów
Czy są jakieś artykuły lub dyskusje na temat wyodrębnienia części tekstu, która zawiera najwięcej informacji o bieżącym dokumencie. Na przykład mam duży zbiór dokumentów z tej samej domeny. Istnieją fragmenty tekstu zawierające kluczowe informacje, o których mówi pojedynczy dokument. Chcę wyodrębnić niektóre z tych części i wykorzystać je jako podsumowanie tekstu. Czy jest jakaś przydatna dokumentacja na temat tego, jak osiągnąć coś takiego? Byłoby naprawdę pomocne, gdyby ktoś mógł skierować mnie we właściwym kierunku, czego powinienem szukać lub czytać, aby uzyskać wgląd w pracę, która mogła być już wykonana w tym zakresie dziedzina przetwarzania języka naturalnego.
To, co opisujesz, często osiąga się za pomocą prostej kombinacji TF-IDF i wyciągu podsumowującego. W skrócie, TF-IDF informuje o względnej ważności każdego słowa w każdym dokumencie, w porównaniu do reszty korpusu. W tym momencie masz ocenę każdego słowa w każdym dokumencie, co odpowiada jego „znaczeniu”. Następnie możesz użyć tych pojedynczych ocen słów do obliczenia łącznej oceny każdego zdania, sumując wyniki każdego słowa w każdym zdaniu. Na koniec, po prostu weź najwyższe N zdań z każdego dokumentu jako podsumowanie. Na początku tego roku stworzyłem iPython Notebook, którego kulminacją jest implementacja tego w Pythonie przy użyciu NLTK i Scikit-learn
Jaka jest alternatywna nazwa „danych nieustrukturyzowanych”?
Obecnie piszę swoją pracę magisterską i przez pewien czas – z powodu braku odpowiedniej alternatywy – utknąłem w „nieuporządkowanych danych” za odniesienie do naturalnego, swobodnie płynącego tekstu, np. artykuły z Wikipedii. Ta nomenklatura niepokoiła mnie od samego początku, ponieważ otwiera debatę, w którą nie chcę wchodzić. Mianowicie, że „nieustrukturyzowany” implikuje, że język naturalny nie ma struktury, czego nie ma – najbardziej oczywistą jest składnia. Daje również negatywne wrażenie, ponieważ jest przeciwieństwem „ustrukturyzowanego”, który jest uznawany za pozytywny. Nie jest to przedmiotem mojej pracy, choć sama „nieuporządkowana” część odgrywa ważną rolę. Całkowicie zgadzam się z autorem tego artykułu, ale on nie proponuje żadnej innej alternatywy dla „bogatych danych”, co nie obejmuje mojego punktu. Chodzi mi o to, aby w tekście brakowało tradycyjnej bazy danych (np. Tabelarycznej) danych, przy czym każdy kawałek ma wyraźny typ danych i semantykę, które są łatwe do interpretacji za pomocą programów komputerowych. Oczywiście chciałbym zawęzić tę definicję do terminu, ale jak dotąd nie udało mi się wymyślić lub odkryć akceptowalnej taksonomii w literaturze.
Nie jest dobrym pomysłem przeciwdziałanie „danym niestrukturalnym” na, powiedzmy, danych tabelarycznych (jak w „danych nie tabelarycznych”), ponieważ trzeba będzie również wyeliminować inne alternatywy (np. „Dane nie-tabelaryczne, nie-graficzme i… dane ”). „Zwykły tekst” (- mój wybór), „nieprzetworzony tekst” lub „surowe dane” brzmią dobrze.