Пользовательский токенайзер и теги nltk - PullRequest
3 голосов
/ 14 октября 2010

Вот мое требование.Я хочу сделать токен и пометить абзац таким образом, чтобы он позволял мне выполнять следующие действия:

  • Следует указать дату и время в абзаце и отметить их как ДАТА и ВРЕМЯ
  • Следует ли идентифицировать известные фразы в абзаце и пометить их как ПОЛЬЗОВАТЕЛЬСКИЕ
  • А остальное содержимое должно быть токенизировано, должно быть токенизировано с помощью функций word_tokenize и pos_tag nltk по умолчанию?пример , следующее предложение
    "They all like to go there on 5th November 2010, but I am not interested."
    

    должно быть помечено и помечено следующим образом в случае, если эта пользовательская фраза «Мне не интересно» .

    [('They', 'PRP'), ('all', 'VBP'), ('like', 'IN'), ('to', 'TO'), ('go', 'VB'), 
    ('there', 'RB'), ('on', 'IN'), ('5th November 2010', 'DATE'), (',', ','), 
    ('but', 'CC'), ('I am not interested', 'CUSTOM'), ('.', '.')]
    

    Любые предложения будут полезны.

Ответы [ 2 ]

7 голосов
/ 14 октября 2010

Правильный ответ - собрать большой набор данных, помеченный так, как вы хотите, а затем обучить его изучению машины.Если это занимает слишком много времени, самый простой способ - запустить POS-тегер и обработать его вывод с помощью регулярных выражений.Здесь самое сложное - найти самое длинное совпадение:

s = "They all like to go there on 5th November 2010, but I am not interested."

DATE = re.compile(r'^[1-9][0-9]?(th|st|rd)? (January|...)( [12][0-9][0-9][0-9])?$')

def custom_tagger(sentence):
    tagged = pos_tag(word_tokenize(sentence))
    phrase = []
    date_found = False

    i = 0
    while i < len(tagged):
        (w,t) = tagged[i]
        phrase.append(w)
        in_date = DATE.match(' '.join(phrase))
        date_found |= bool(in_date)
        if date_found and not in_date:          # end of date found
            yield (' '.join(phrase[:-1]), 'DATE')
            phrase = []
            date_found = False
        elif date_found and i == len(tagged)-1:    # end of date found
            yield (' '.join(phrase), 'DATE')
            return
        else:
            i += 1
            if not in_date:
                yield (w,t)
                phrase = []

Todo: разверните DATE re, вставьте код для поиска CUSTOM фраз, сделайте его более сложным, сопоставив POS-теги и токеныи решить, должна ли 5th сама по себе считаться датой.(Вероятно, нет, поэтому отфильтруйте даты, длина которых содержит только порядковый номер.)

2 голосов
/ 15 октября 2010

Вам, вероятно, следует выполнить разделение на части с помощью nltk.RegexpParser, чтобы достичь своей цели.

Ссылка: http://nltk.googlecode.com/svn/trunk/doc/book/ch07.html#code-chunker1

...