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

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

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

  • Как узнать, скомпилирован ли Python с UCS-2 или UCS-4?
  • Python: UnicodeEncodeError: кодек «latin-1» не может кодировать символ
  • Как удалить символы, отличные от ASCII, но оставить периоды и пробелы с помощью Python?
  • UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe9' в позиции 7: порядковый номер не в диапазоне (128)
  • Лучший способ конвертировать URL-адрес Unicode в ASCII (UTF-8-escaped) в Python?
  • Django: символ не-ASCII
  • Python: как перенести файл с файлом unicode в папку юникода
  • Строка Юникода Python, хранящаяся как «\ u84b8 \ u6c7d \ u5730» в файле, как ее преобразовать в Unicode?
  • 5 Solutions collect form web for “Как символизировать слово малаялам?”

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

    Конфликтная задача

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

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

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

    Границы слов

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

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

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

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

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

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

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

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

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

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

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

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

    возможно, алгоритм Витерби может помочь?

    Этот ответ на другой вопрос SO (и другой ответ с высоким рейтингом) может помочь: https://stackoverflow.com/a/481773/583834

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

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

    [вне]:

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

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

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

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

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

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

    Python - лучший язык программирования в мире.