2009-10-29 11 views
39

Mam około 100 megabajtów tekstu, bez żadnych znaczników, podzielone na około 10 000 wpisów. Chciałbym automatycznie wygenerować listę "tagów". Problem polega na tym, że istnieją grupy słów (tj. Frazy), które mają sens tylko wtedy, gdy są zgrupowane razem.Algorytmy wykrywania fraz i słów kluczowych z tekstu

Jeśli po prostu policz słowa, otrzymuję dużą liczbę naprawdę popularnych słów (jest, jest, dla, w, jestem, itp.). Policzyłem słowa i liczbę innych słów, które są przed i po nim, ale teraz naprawdę nie mogę wymyślić, co robić dalej. Informacje dotyczące fraz 2 i 3 wyrazów są obecne, ale jak wyodrębnić te dane?

+0

Możesz najpierw wyczyścić dane wejściowe, usuwając typowe "szumowe" słowa z listą słów kończących. – teabot

+0

@teabot, tak, radzenie sobie ze słowami o szumach jest ważne, ale nie powinno się tego robić, dopóki te słowa nie będą służyć innym celom. Na przykład, jeśli zamierzasz oznaczyć POS tekstem wejściowym, będą wymagane słowa szumu. Nawet bez znaczników POS, prostsze techniki mogą wykorzystywać te słowa szumów do wyprowadzania granic ekspresji itd. – mjv

+0

@Kimvais, proszę podać więcej informacji na temat celu dużej "listy znaczników". Czy jest to tylko indeksowanie tekstu, czy jest to sposób na tworzenie chmurek tagów, czy jest to krok w kierunku kategoryzacji podstawowych dokumentów, itp.? Dzięki tym dodatkowym informacjom, współtwórcy SO będą w stanie lepiej odpowiedzieć na to stosunkowo szerokie zadanie.Może być tak, że potrzebujesz tylko Swish-e, który jest podpowiedziany przez heferav, lub może potrzebujesz więcej sugestii i pomysłów, jak dostosować różne praktyki NLP, aby zaspokoić określoną potrzebę (niekoniecznie "wymyślanie koła"). – mjv

Odpowiedz

34

Przed wszystkim, postaraj się zachować informację o "granicach", które pojawiają się w tekście wejściowym.
(jeśli takie informacje nie łatwo zostać utracone, Twoje pytanie sugeruje, że być może tokenizacja jest łatwo zostało zrobione)
Podczas tokenizacja (parsowania tekstu, w tym przypadku) procesu, szukać wzorów, które mogą definiować granic ekspresji (takie jak interpunkcja, szczególnie kropki, a także wiele separacji LF/CR, użyj ich.Również słowa takie jak "," często mogą być używane jako granice. Takie granice wyrażeń są zazwyczaj "negatywne", w tym sensie, że oddzielają dwa tokeny instancje, które na pewno nie są uwzględnione w tym samym wyrażeniu.Niekt dodatnimi granicami są cytaty, w szczególności podwójne cudzysłowy Ten rodzaj informacji może być przydatny do odfiltrowania niektórych n-gramów (patrz następny akapit). sekwencje wyrazów, takie jak "for example e "lub" zamiast "lub" potrzeba "może być użyte również jako granica ekspresji (ale używanie takich informacji ogranicza się do używania" priors ", o czym mówię później).

bez wykorzystywania danych zewnętrznych (inne niż tekstu wejściowego), można mieć względny sukces to uruchamiając statystyki na digrams tekstu i Trygramów (sekwencja 2 oraz 3 kolejnych słów). Następnie [najbardziej] sekwencje ze znaczną (*) liczbą wystąpień będą prawdopodobnie typem "wyrażenia/fraz", którego szukasz.
Ta nieco prymitywna metoda da kilka fałszywych pozytywów, ale w sumie może być wykonalna. Po przefiltrowaniu n-gramów, o których wiadomo, że przekraczają "granice", jak wskazano w pierwszym akapicie, może znacznie pomóc, ponieważ w językach naturalnych kończenie zdań i rozpoczyna się zdanie, mają tendencję do czerpania z ograniczonego podzbioru przestrzeni wiadomości, a zatem generują kombinacje tokena, które mogą wydają się być dobrze reprezentowane statystycznie, ale zazwyczaj nie są ze sobą powiązane.

Lepsze metody (prawdopodobnie droższe, przetwarzające i zgodne z projektem/inwestycją), wykorzystają dodatkowe "dane wyjściowe" dotyczące domeny i/lub języków narodowych tekstu wejściowego.

  • POS (Part-Of-Speech) tagging jest bardzo przydatne, na kilka sposobów (dostarcza dodatkowych, bardziej obiektywne granice ekspresji, a także słowa „szum” zajęcia, na przykład wszystkich artykułów, nawet jeśli są stosowane w kontekście podmiotów są zazwyczaj mało tagu chmury takie, że OP chce produkować:
  • Słowniki i leksykony mogą być całkiem użyteczne, w szczególności te, które identyfikują "byty" (inaczej instancje w języku WordNet) i ich alternatywne formy. ważne dla chmury tagów (choć nie są jedyną klasą słów w nich znalezionych), a poprzez ich identyfikację możliwe jest ich normalizowanie (wiele różnych naciski, które można wykorzystać, by powiedzieć "Senator T. Kennedy"), eliminując duplikaty, ale również zwiększając częstotliwość podstawowych obiektów.
  • jeśli korpus jest skonstruowany jako zbiór dokumentów, może być przydatna do korzystania z różnych sztuczek związanych z TF (częstotliwość Term) i IDF (odwrotność częstotliwości Document)

[Przepraszam, muszę iść, bo teraz (plus chciałby uzyskać więcej szczegółowych informacji na temat konkretnych celów itp.). Postaram się podać więcej szczegółów i pointes późniejsze]

[BTW, chcę podłączyć tutaj Jonathan Feinberg i Dervin Thunk odpowiedzi z tego postu, ponieważ zapewniają doskonałe wskazówki, w zakresie metod i narzędzi do rodzaj zadania w zasięgu ręki. W szczególności NTLK i Python-at-large zapewniają doskonałe ramy dla eksperymenty]

0

Czy macierz dla słów. Następnie, jeśli są dwa kolejne słowa, dodaj jeden do odpowiedniej komórki.

For example you have this sentence. 

mat['for']['example'] ++; 
mat['example']['you'] ++; 
mat['you']['have'] ++; 
mat['have']['this'] ++; 
mat['this']['sentence'] ++; 

Podaje wartości dwóch kolejnych słów. Możesz zrobić to słowo również trzy słowa. Uwaga, wymaga to pamięci O (n^3).

Można również użyć sterty do przechowywania danych takich jak:

heap['for example']++; 
heap['example you']++; 
11

zacząłbym ze wspaniałym rozdziale przez Peter Norvig w książce O'Reilly Beautiful Data. Dostarcza dane ngram, których potrzebujesz, wraz z pięknym kodem Pythona (który może rozwiązać twoje problemy tak, jak jest, lub z pewną modyfikacją) on his personal web site.

+1

To wspaniały rozdział, całkowicie wart czytania - powinienem wiedzieć, odkąd jestem w podziękowaniach. :-) Ale nie odnosi się bezpośrednio do zaksięgowanego pytania. (Myślę, że moja odpowiedź brzmi.) Chodzi o to, * rodzaj * rzeczy, które możesz zrobić ze statystykami n-gramowymi z korpusu tekstowego, i jak z przykładami takimi, jak poprawianie pisowni, rozwiązywanie kryptogramów i dzielenie słów na słowa kluczowe bez żadnych obszarów. –

+0

Tak, ale korzystając z połączonych z nim danych ngram mógł szybko zdmuchnąć swój zestaw danych i wydobyć znaczące ngramy. –

+0

Wygląda na to, że Kimvais już wyliczył n-gram danych z własnego zestawu danych i pyta, jak używać tych danych do rozróżniania sekwencji słów, które pojawiają się znacznie częściej niż przez przypadek. –

0

Jednym ze sposobów byłoby zbudować sobie automat. najprawdopodobniej niedeterministyczny automat skończony (NFA). NFA

Innym prostszym sposobem jest utworzenie pliku, który zawiera słowa i/lub grupy słów, które chcesz ignorować, znajdować, porównywać itp. I przechowywać je w pamięci po uruchomieniu programu, a następnie może porównać plik, który analizujesz z grupami słów/słów, które znajdują się w pliku.

7

Wygląda na to, że szukasz collocation extraction. Manning and Schütze poświęcam chapter tematowi, wyjaśniając i oceniając "proponowane formuły" wymienione w artykule z Wikipedii, do którego linkowałem.

Nie mogę dopasować całego rozdziału do tej odpowiedzi; miejmy nadzieję, że niektóre z their links pomogą. (NSP brzmi szczególnie trafnie.) Nltk również ma collocations module, nie wspomniany przez Manninga i Schütze, ponieważ ich książka poprzedza.

Inne odpowiedzi opublikowane do tej pory dotyczą przetwarzania języka statystycznego i n-gramów bardziej ogólnie; kolokacje są specyficznym podtematem.

Powiązane problemy