2010-10-03 10 views
6

Zastanawiałem się, jak ty pójdzie o tokenizing ciągi w języku angielskim (lub innych językach zachodnich), jeśli odstępy zostały usunięte?Justadistraction: tokenizing English bez białych znaków. Murakami SheepMan

Inspiracją dla tej kwestii jest postać Sheep Człowiek w powieści Murakami „Dance Dance Dance

W powieści Sheep Człowiek jest tłumaczone jako mówiąc takie rzeczy jak:

„likewesaid, my” lldowhatwecan. Trytoreconnectyou, towhatyouwant ", powiedział mężczyzna owiec. "Butwecan'ddoit-alone. Yougottaworktoo."

Tak więc niektóre znaki interpunkcyjne są zachowywane, ale nie wszystkie. Wystarczy, aby człowiek mógł ją przeczytać, ale jest nieco arbitralny.

Jaka byłaby Twoja strategia tworzenia parsera? Typowe kombinacje liter, liczby sylab, gramatyki warunkowej, regexps look-ahead/behind itp.?

W szczególności python-wise, w jaki sposób utworzyłbyś (tłumaczący) przepływ tłumaczeń? Nie prośba o kompletną odpowiedź, tylko o to, w jaki sposób twój proces myślowski pozwoliłby rozwiązać problem.

Pytam o to w frywolny sposób, ale myślę, że jest to pytanie, które może uzyskać kilka ciekawych (NLP/crypto/częstotliwość/socjalne) odpowiedzi. Dzięki!

Odpowiedz

3

Tak naprawdę zrobiłem coś takiego w pracy około osiem miesięcy temu. Właśnie użyłem słownika angielskich słów w hashtable (dla czasów wyszukiwania O (1)). Pójdę po literę dopasowując całe słowa. Działa dobrze, ale jest wiele niejasności. (asshit może być trafiony w dupę lub jako gówno). Aby rozwiązać te niejednoznaczności wymagałoby znacznie bardziej wyrafinowanej analizy gramatycznej.

+0

Można spróbować drzewa radix na piśmie przez wyszukiwań liter. Pozwoliłoby to również łatwo stwierdzić, czy były dłuższe potencjalne dopasowania. – Olson

+1

Och, wow. Myślałem o czymś takim (drzewo z 26 dziećmi w każdym węźle, było moją myślą), ale mój szef powiedział, że to absurdalny pomysł. Muszę przestać go słuchać. > :( – JoshD

+0

+1 Tak naprawdę myślałem o czymś takim jakiś czas temu, nawet natknąłem się na te same problemy: "cześć tam" == "hithere" == "uderzenie tutaj". "Aby ją zdobyć" == " razem "==" razem ". – inspectorG4dget

2

Po pierwsze, myślę, że potrzebujesz słownika angielskich słów - możesz wypróbować niektóre metody, które opierają się wyłącznie na analizie statystycznej, ale myślę, że słownik ma większe szanse na dobre wyniki.

Gdy masz słowa, masz dwa możliwe podejścia:

Można kategoryzować słowa w kategoriach gramatycznych i używać formalnego gramatyki do analizowania zdania - oczywiście, byś czasami nie pasuje lub kilka mecze - Nie jestem zaznajomiony z technikami, które pozwolą ci poluzować zasady gramatyki w przypadku braku dopasowania, ale jestem pewien, że muszą być pewne.

Z drugiej strony, można po prostu wziąć duży korpus angielskiego tekstu i obliczyć prawdopodobieństwo względne niektórych słów znajdujących się obok siebie - otrzymując listę pary i trzech słów. Ponieważ struktura danych byłaby raczej duża, można by użyć kategorii słów (gramatycznych i/lub opartych na znaczeniu), aby ją uprościć. Następnie budujesz automat i wybierasz najbardziej prawdopodobne przejścia między słowami.

Jestem pewien, że istnieje wiele innych możliwych podejść. Możesz nawet połączyć te dwie, o których wspomniałem, budując gramatykę z wagą związaną z jej zasadami. To jest bogate pole do eksperymentów.

1

To tylko kilka szybkich kodów, które napisałem, że myślę, że działałyby całkiem dobrze, aby wyodrębnić słowa z fragmentu, takiego jak ten, który dałeś ... To nie jest w pełni przemyślane, ale myślę, że coś takiego mogłoby zadziałać, gdyby nie można znaleźć wstępnie pakowane typu rozwiązania

textstring = "likewesaid, we'lldowhatwecan. Trytoreconnectyou, towhatyouwant," said the Sheep Man. "Butwecan'tdoit-alone. Yougottaworktoo." 

indiv_characters = list(textstring) #splits string into individual characters 

teststring = '' 
sequential_indiv_word_list = [] 

for cur_char in indiv_characters: 
    teststring = teststring + cur_char 
    # do some action here to test the testsring against an English dictionary where you can API into it to get True/False if it exists as an entry 
    if in_english_dict == True: 
     sequential_indiv_word_list.append(teststring) 
     teststring = '' 

#at the end just assemble a sentence from the pieces of sequential_indiv_word_list by putting a space between each word 

Istnieje kilka kwestii do dopracowania, jak gdyby nigdy nie zwraca mecz, byłoby to oczywiście nie działa, ponieważ nie będzie pasować, jeśli to po prostu dodawałem kolejne znaki, jednak ponieważ twój ciąg demo miał kilka spacji, mógłbyś je rozpoznać i automatycznie zacząć od początku.

Ponadto trzeba uwzględnić interpunkcji, napisać warunkowe jak

if cur_char == ',' or cur_char =='.': 
    #do action to start new "word" automatically 
Powiązane problemy