Как я могу пометить и портировать французский текст, используя NLTK и Python? - PullRequest
11 голосов
/ 12 марта 2012

У меня более 30000 статей на французском языке в файле JSON.Я хотел бы провести анализ текста как по отдельным статьям, так и по сектору в целом.Прежде чем идти дальше, я начну с простых целей:

  • Определите важные объекты (люди, места, концепции)
  • Найдите существенные изменения в важности (~ = частота)эти объекты с течением времени (используя порядковый номер статьи в качестве прокси для времени)

Шаги, которые я предпринял до сих пор:

  1. Импортированные данные всписок питонов:

    import json
    json_articles=open('articlefile.json')
    articlelist = json.load(json_articles)
    
  2. Выделил одну статью для тестирования и объединил основной текст в одну строку:

    txt =  ' '.join(data[10000]['body'])
    
  3. Загрузил токенизатор французского предложения и разбил строку на список предложений:

    nltk.data.load('tokenizers/punkt/french.pickle')
    tokens = [french_tokenizer.tokenize(s) for s in sentences]
    
  4. Попытка разбить предложения на слова с помощью WhiteSpaceTokenizer:

    from nltk.tokenize import WhitespaceTokenizer
    wst = WhitespaceTokenizer()
    tokens = [wst.tokenize(s) for s in sentences]
    

Вот где я застрял по следующим причинам:

  • В NLTK нет встроенного токенизатора, который может разбивать французский на слова.Пробелы не работают хорошо, в частности из-за того, что они не будут правильно разделяться на апострофах.
  • Даже если бы я использовал регулярные выражения для разделения на отдельные слова, нет французского PoS (части речи) тег, который я могу использовать, чтобы пометить эти слова, и никакой возможности разбить их на логические единицы значения

Для английского языка я мог бы пометить и разбить текст на части так:

    tagged = [nltk.pos_tag(token) for token in tokens]
    chunks = nltk.batch_ne_chunk(tagged)

Мои основные параметры (в порядке текущих предпочтений) выглядят следующим образом:

  1. Используйте nltk-trainer для обучения моего собственного тегера и чанкера.
  2. Используйте оболочку Python для TreeTagger только для этой части, поскольку TreeTagger уже может пометить французский, а кто-то написал оболочку, которая вызывает двоичный файл TreeTagger и анализирует результаты.
  3. Используйте другой инструмент в целом.

Если бы я сделал (1), я бы подумал, что мне нужно было бы создать свой собственный помеченный корпус.Правильно ли это, или можно (и будет ли это возможно) использовать French Treebank?

Если формат French Treebank corpus ( пример здесь ) не подходит для использования с nltk-trainerВозможно ли преобразовать его в такой формат?

Какие подходы франкоговорящих пользователей NLTK приняли к тегу PoS и чанку?

Ответы [ 3 ]

5 голосов
/ 13 марта 2012

Начиная с версии 3.1.0 (январь 2012 г.), тегер Stanford PoS поддерживает французский язык.

Должно быть возможно использовать этот французский тегер в NLTK, используя интерфейс Нитина Маднани для POS-тегера Stanford

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

5 голосов
/ 10 августа 2013

Существует также TreeTagger (поддерживающий французский корпус) с оболочкой Python.Это решение, которое я сейчас использую, и оно работает довольно хорошо.

4 голосов
/ 12 марта 2012

Вот несколько предложений:

  1. WhitespaceTokenizer делает то, для чего предназначен. Если вы хотите разделить апострофы, попробуйте WordPunctTokenizer, проверьте другие доступные токенизаторы или сверните свой собственный с помощью токенайзера Regexp или напрямую с помощью модуля re.

  2. Убедитесь, что вы решили проблемы с кодировкой текста (Unicode или Latin1), в противном случае токенизация все равно пойдет не так.

  3. Как вы обнаружили, nltk поставляется только с английским тегером. Похоже, использование TreeTagger было бы наименьшей работой, поскольку оно (почти) готово к использованию.

  4. Тренировка самостоятельно также является практическим вариантом. Но вы определенно не должны создавать свой собственный учебный корпус! Используйте существующий помеченный корпус французского языка. Вы получите лучшие результаты, если жанр обучающего текста соответствует вашему домену (статьям). Кроме того, вы можете использовать nltk-trainer, но вы также можете напрямую использовать функции NLTK.

  5. Вы можете использовать французский корпус Treebank для обучения, но я не знаю, есть ли читатель, который знает его точный формат. Если нет, вы должны начать с XMLCorpusReader и создать его подкласс для предоставления метода tagged_sents ().

  6. Если вы еще не в списке рассылки nltk-users, думаю, вы захотите в него попасть.

...