Как я могу пометить и вырезать французский текст с помощью NLTK и Python?

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

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

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

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

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

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

    nltk.data.load('tokenizers/punkt/french.pickle')
    tokens = [french_tokenizer.tokenize(s) for s in sentences]
    
  • Попытка разделить предложения на слова с помощью 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)

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

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

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

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

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

Ответ 1

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

Должно быть возможно использовать этот французский теггер в NLTK, используя Nitin Madnani Интерфейс для стенографического POS-тегатора в Стэнфорде

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

Ответ 2

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

Ответ 3

Вот несколько советов:

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

  • Убедитесь, что вы устранили проблемы с кодировкой текста (unicode или latin1), в противном случае токенизация по-прежнему будет ошибочной.

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

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

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

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