Как символизировать слово малаялам?

ഇതുഒരുസ്ടലംമാണ്  

itu oru stalam anu

Это строка Юникода, означающая, что это место

import nltk
nltk.wordpunct_tokenize('ഇതുഒരുസ്ഥാലമാണ് '.decode('utf8'))

не работает для меня.

nltk.word_tokenize('ഇതുഒരുസ്ഥാലമാണ് '.decode('utf8'))

также не работает другие примеры

"കണ്ടില്ല "  = കണ്ടു +ഇല്ല,
"വലിയൊരു"  = വലിയ + ഒരു

Right Split:

ഇത്  ഒരു സ്ഥാലം ആണ് 

выход:

[u'\u0d07\u0d24\u0d4d\u0d12\u0d30\u0d41\u0d38\u0d4d\u0d25\u0d32\u0d02\u0d06\u0d23\u0d4d']

Мне просто нужно разбить слова, как показано в другом примере. Другой примерный раздел предназначен для тестирования. Проблема не в Unicode. Это с морфологией языка. для этого вам нужно использовать морфологический анализатор
Взгляните на эту статью. http://link.springer.com/chapter/10.1007%2F978-3-642-27872-3_38

Ответ 1

После крушения курса из wikipedia (http://en.wikipedia.org/wiki/Malayalam) в вашем вопросе есть некоторые проблемы и инструменты, ve запросил для вашего желаемого выхода.

Конфиденциальная задача

Во-первых, OP объединила задачу морфологического анализа, сегментации и символики. Часто существует отличное различие, особенно для агглюнистических языков, таких как турецкий/малаялам (см. http://en.wikipedia.org/wiki/Agglutinative_language).

Агглютинативные НЛП и лучшие практики

Затем я не думаю, что tokenizer подходит для малаялама, агглютинативного языка. Один из самых изученных агглунирующих языков в НЛП, турецкий язык принял другую стратегию, когда дело доходит до "токенизации", они обнаружили, что необходим полномасштабный морфологический анализатор (см. http://www.denizyuret.com/2006/11/turkish-resources.html, www.andrew.cmu.edu/user/ko/downloads/lrec.pdf).

Границы Word

Токсификация определяется как идентификация лингвистически значимых единиц (LMU) из текстового текста (см. Зачем мне нужен токенизатор для каждого языка?) И на другом языке для определения границы слова на разных языках потребуется другой токенизатор. У разных людей есть подход к поиску границы слов, но в резюме в НЛП люди подписались на следующее:

  • Агглютинативные языки требует полномасштабного морфологического анализатора, подготовленного с помощью некоторых языковых моделей. Часто бывает только один уровень при определении того, что есть token, и это на морфемном уровне, поэтому сообщество НЛП разработало различные языковые модели для своих соответствующих инструментов морфологического анализа.

  • Полисинтетические языки с заданной границей слов имеют выбор из двух уровней tokenization, где система может сначала идентифицировать изолированное слово, а затем, если необходимо, морфологический анализ должен быть сделан для получения более тонкие жетоны. Зеркальный токенизатор может разделять строку с использованием определенного разделителя (например, NLTK word_tokenize или punct_tokenize, который использует пробелы/знаки препинания для английского языка). Затем для более тонкого анализа зерна на морфемном уровне люди обычно используют некоторые конечные машины для разделения слов на морфему (например, на немецком языке http://canoo.net/services/WordformationRules/Derivation/To-N/N-To-N/Pre+Suffig.html)

  • Полисинтетические Langauges без указанной границы слова часто требуют, чтобы сегментщик сначала добавлял пробелы между токенами, потому что орфография не различает границы слов (например, на китайском языке https://code.google.com/p/mini-segmenter/). Затем из разделенных жетонов, если необходимо, может быть сделан морфемный анализ для получения тонких жетонов зерна (например, http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html). Часто эти тонкие метки зерна связаны с тегами POS.

Вкратце ответ на запрос/вопрос OP, OP использовал неправильные инструменты для задачи:

  • Для вывода tokens для Malayalam необходим морфологический анализатор, простой маркенкер грубой зернистости в NLTK не будет работать.
  • токенизатор NLTK предназначен для того, чтобы токенизировать полисинтетические языки с заданной границей слов (например, английские/европейские языки), поэтому не работает токенизатор для малаялам, это просто не предназначено для токенизации агглунистических языков.
  • Для достижения результата необходимо создать полномасштабный морфологический анализатор для языка, и кто-то его построил (aclweb.org/anthology//O/O12/O12-1028.pdf), OP должен связаться с автор статьи, если он заинтересован в инструменте.
  • За исключением создания морфологического анализатора с языковой моделью, я рекомендую OP сначала определить общие разделители, которые разбивают слова на морфемы на языке, а затем выполняют простой re.split() для достижения базового токенизатора.

Ответ 2

Знаменатель действительно является правильным инструментом; конечно, это то, что называет их НЛТК. Морфологический анализатор (как в статье, на которую вы ссылаетесь) предназначен для разложения слов на более мелкие части (морфемы). Но в вашем примере кода вы попытались использовать токенизатор, подходящий для английского языка: он распознает слова с пробелами и знаки пунктуации. Поскольку Малаялам, по-видимому, не указывает границы слов с пробелами или чем-то еще, вам нужен другой подход.

Таким образом, NLTK не предоставляет ничего, что определяет границы слов для малаялам. Тем не менее, это может обеспечить инструменты для создания достойного.

Очевидным подходом будет поиск словаря: попробуйте разбить ваш ввод на строки, которые находятся в словаре. Но это было бы сложнее, чем кажется: вам нужен очень большой словарь, вам все равно придется иметь дело с неизвестными словами, и поскольку у малаялам есть нетривиальная морфология, вам может понадобиться морфологический анализатор, чтобы соответствовать флексированным словам словарь. Предполагая, что вы можете хранить или генерировать каждую форму слова с помощью своего словаря, вы можете использовать алгоритм, подобный описанному здесь (и уже упомянутый @amp), чтобы разделить ваш ввод на последовательность слов.

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

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

PS. В NLTK есть несколько статистических инструментов токенизации; PunctSentenceTokenizer можно обучить распознавать границы предложений, используя неконтролируемый алгоритм обучения (это означает, что вам не нужно отмечать границы в обучении данные). К сожалению, алгоритм специально нацелен на проблему аббревиатур, и поэтому он не может быть адаптирован к обнаружению границ слов.

Ответ 4

Кажется, что ваше пространство является символом юникода u'\u0d41'. Таким образом, вы должны нормально разделить с str.split().

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

x = 'ഇതുഒരുസ്ഥാലമാണ്'.decode('utf8')
y = x.split(u'\u0d41')
print " ".join(y)

[выход]:

ഇത ഒര സ്ഥാലമാണ്`

Ответ 5

Я попробовал следующее:

# encoding=utf-8

import nltk
cheese = nltk.wordpunct_tokenize('ഇതുഒരുസ്ഥാലമാണ്'.decode('utf8'))
for var in cheese:
    print var.encode('utf8'),

И как результат, я получил следующее:

ഇത ു ഒര ു സ ് ഥ ാ ലമ ാ ണ ്

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