2015-05-03 12 views
6

Po wykonaniu kilku innych postów, [np. Detect English verb tenses using NLTK, Identifying verb tenses in python, Python NLTK figure out tense] Napisałem następujący kod w celu określenia napięta zdania w Pythonie przy użyciu POS tagowanie:Wyznaczanie czasu zdania Python

from nltk import word_tokenize, pos_tag 

def determine_tense_input(sentance): 
    text = word_tokenize(sentance) 
    tagged = pos_tag(text) 

    tense = {} 
    tense["future"] = len([word for word in tagged if word[1] == "MD"]) 
    tense["present"] = len([word for word in tagged if word[1] in ["VBP", "VBZ","VBG"]]) 
    tense["past"] = len([word for word in tagged if word[1] in ["VBD", "VBN"]]) 
    return(tense) 

ta zwraca wartość do wykorzystania ostatnich/obecnych/przyszłych czasowników, które zazwyczaj wtedy wziąć maksymalna wartość jako czas napięcia. Dokładność jest umiarkowanie przyzwoita, ale zastanawiam się, czy jest lepszy sposób na zrobienie tego.

Na przykład, czy istnieje teraz przypadek napisany pakiet, który jest bardziej przeznaczony do wydobywania czasu z sentencji? [uwaga - 2 z 3 słupków przepełnienia stosu mają 4 lata, więc rzeczy mogły się teraz zmienić]. Lub alternatywnie, czy powinienem używać innego parsera z wewnątrz nltk, aby zwiększyć dokładność? Jeśli nie, miej nadzieję, że powyższy kod może pomóc komuś innemu!

+0

Może możesz spróbować znaleźć bardziej dokładnego taggera. Albo trenując własny na podstawie oznaczonego korpusu, albo używając czegoś ze Stanford, np. Uważam, że z pewnych powodów (takich jak ten) znaczące tagowanie z nltk.pos_tag (lub dostępnych corporów w nltk_data) naprawdę nie pomaga bardzo. Używanie taggera z bardziej wyrazistymi klasami pomogło mi wcześniej w podobnych scenariuszach. Wszystko to zależy jednak od dostępności zazwyczaj adnotowanych korpusów, które są dość specyficzne dla domeny. – Igor

+1

Aby uzyskać bardziej dokładne podejście, należy rozróżnić czas podstawowy i wtórny. Moja odpowiedź na podobne pytanie może pomóc: http://stackoverflow.com/a/22146151/1011791 –

+0

@ChthonicProject - Dziękuję - Nie widziałem tego postu, a to pomaga wskazać mi właściwy kierunek – kyrenia

Odpowiedz

0

Możesz wzmocnić swoje podejście na różne sposoby. Możesz więcej myśleć o gramatyce języka angielskiego i dodać więcej zasad na podstawie tego, co obserwujesz; lub możesz popchnąć podejście statystyczne, wydobyć więcej (odpowiednich) cech i rzucić całą partię w klasyfikatorze. NLTK daje ci mnóstwo klasyfikatorów do gry i są dobrze udokumentowane w książce NLTK.

Możesz mieć to, co najlepsze z obu światów: reguły napisane ręcznie mogą mieć postać funkcji, które są podawane do klasyfikatora, który decyduje, kiedy może na nich polegać.

1

Można użyć Stanford Parser, aby uzyskać analizę zależności zdania. Źródłem analizy zależności będzie "podstawowy" czasownik, który definiuje zdanie (nie jestem zbyt pewny, jaki jest konkretny termin lingwistyczny). Następnie możesz użyć znacznika POS w tym czasowniku, aby znaleźć jego czas i użyć go.