ഇതുഒരുസ്ടലംമാണ്
itu oru stalam anu
这是一个Unicode字符串,意思是这是一个地方
^{pr2}$对我没用。在
nltk.word_tokenize('ഇതുഒരുസ്ഥാലമാണ് '.decode('utf8'))
也不起作用 其他示例
"കണ്ടില്ല " = കണ്ടു +ഇല്ല,
"വലിയൊരു" = വലിയ + ഒരു
右拆分:
ഇത് ഒരു സ്ഥാലം ആണ്
输出:
[u'\u0d07\u0d24\u0d4d\u0d12\u0d30\u0d41\u0d38\u0d4d\u0d25\u0d32\u0d02\u0d06\u0d23\u0d4d']
我只需要按照另一个例子所示拆分单词。其他示例部分用于测试。The问题不在于Unicode。它与语言的形态有关。为此,您需要使用形态分析仪
看看这张报纸。
http://link.springer.com/chapter/10.1007%2F978-3-642-27872-3_38
tk-nlizer确实是这样称呼他们的。词形分析器(如您链接到的文章中所述)用于将单词分解成更小的部分(语素)。但是在您的示例代码中,您尝试使用一个适合英语的标记器:它可以识别空格分隔的单词和标点符号。因为马拉雅拉姆语显然没有用空格或任何其他词来表示单词的边界,所以您需要一种不同的方法。在
所以NLTK没有提供任何可以检测马拉雅拉姆语单词边界的东西。不过,它可能提供了相当容易地构建一个像样的工具。在
显而易见的方法是尝试字典查找:尝试将输入分解为字典中的字符串。但这比听起来更难:你需要一个非常大的字典,你仍然需要以某种方式处理未知单词,而且由于马拉雅拉姆语有非平凡的词形,你可能需要一个词形分析器来匹配词形变化的单词。假设您可以用字典存储或生成每个单词形式,那么您可以使用类似于here(并且@amp已经提到)的算法来将输入划分为一系列单词。在
一个更好的选择是使用一个统计算法,它可以猜测单词的边界在哪里。我不知道NLTK中有这样一个模块,但在这方面,中国人已经做了很多工作。如果值得你费心的话,你可以找到一个合适的算法并训练它在马拉雅拉姆语上工作。在
简而言之:NLTK标记器只适用于英语的排版风格。你可以训练一个合适的工具来处理马拉雅拉姆语,但据我所知,NLTK并不包括这样的工具。在
NLTK有几个统计标记化工具;可以使用无监督学习算法训练^{} 来识别句子边界(这意味着您不需要在训练数据中标记边界)。不幸的是,the algorithm专门针对缩略语的问题,因此它不能适用于词边界检测。在
经过维基百科(http://en.wikipedia.org/wiki/Malayalam)的速成课程后,您的问题和所需的工具中存在一些问题。在
合并任务
首先,操作集形态学分析、分割和标记化于一体。尤其是土耳其语/马拉雅拉姆语(见http://en.wikipedia.org/wiki/Agglutinative_language)这类凝聚语通常有很好的区别。在
粘性NLP和最佳实践
其次,我认为
tokenizer
不适合马拉雅拉姆语,一种粘性语言。土耳其语是自然语言处理中研究最多的一种语言,当谈到“标记化”时,土耳其语采取了不同的策略,他们发现一个完整的词法分析器是必要的(见http://www.denizyuret.com/2006/11/turkish-resources.html,www.andrew.cmu.edu/user/ko/downloads/lrec.pdf). 在单词边界
标记化被定义为从表层文本中识别语言意义单位(LMU),不同的语言需要不同的标记器来识别不同语言的词边界。不同的人对寻找词边界的问题有不同的看法,但在NLP中,人们的意见如下:
粘着语言需要一个成熟的形态分析工具,并用某种语言模型进行训练。当识别什么是{}时,通常只有一个单一的层次,这是在语素层面上,因此NLP社区为他们各自的形态分析工具开发了不同的语言模型。
具有指定词边界的多合成语言可以选择两层},后者使用空格/标点符号表示英语)。为了在语素水平上进行更精细的粒度分析,人们通常会使用一些有限状态机将单词拆分为语素(例如德语中的http://canoo.net/services/WordformationRules/Derivation/To-N/N-To-N/Pre+Suffig.html)
tokenization
,系统可以首先识别一个孤立的词,然后在必要时进行形态学分析以获得更细的粒度标记。粗粒度标记器可以使用特定的分隔符拆分字符串(例如,NLTK的word_tokenize
或{没有指定词边界的多合成语言通常需要首先使用分段器在标记之间添加空格,因为正字法无法区分单词边界(例如在中文https://code.google.com/p/mini-segmenter/)。然后从定界标记中,如果需要,可以进行语素分析以生成更细的标记(例如http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html)。这种细粒度的代币通常与POS标签捆绑在一起。
简单回答OP的请求/问题,OP在任务中使用了错误的工具:
tokens
为马拉雅拉姆语,一个形态分析器是必要的,简单的粗粒度标记器在NLTK中不起作用。在re.split()
来实现基线标记器。在也许Viterbi algorithm能帮上忙吗?在
对另一个SO问题的回答(以及另一个高投票率的答案)可能会有所帮助:https://stackoverflow.com/a/481773/583834
相关问题 更多 >
编程相关推荐