Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何标记马来语单词?_Python_Unicode_Nltk - Fatal编程技术网

Python 如何标记马来语单词?

Python 如何标记马来语单词?,python,unicode,nltk,Python,Unicode,Nltk,斯大林阿努酒店 这是一个Unicode字符串,表示这是一个地方 他不适合我 import nltk nltk.wordpunct_tokenize('ഇതുഒരുസ്ഥാലമാണ് '.decode('utf8')) 也不起作用 其他例子 nltk.word_tokenize('ഇതുഒരുസ്ഥാലമാണ് '.decode('utf8')) 右拆分: "കണ്ടില്ല " = കണ്ടു +ഇല്ല, "വലിയൊരു" = വലിയ + ഒരു 输出: ഇത് ഒരു സ്ഥ

斯大林阿努酒店

这是一个Unicode字符串,表示这是一个地方

他不适合我

import nltk
nltk.wordpunct_tokenize('ഇതുഒരുസ്ഥാലമാണ് '.decode('utf8'))
也不起作用 其他例子

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

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

ഇത്  ഒരു സ്ഥാലം ആണ് 
我只需要拆分单词,如另一个示例所示。另一个示例部分用于测试。问题不在于Unicode。它与语言的形态有关。为此,您需要使用形态分析器
看看这张纸。 我尝试了以下方法:

[u'\u0d07\u0d24\u0d4d\u0d12\u0d30\u0d41\u0d38\u0d4d\u0d25\u0d32\u0d02\u0d06\u0d23\u0d4d']
# encoding=utf-8

import nltk
cheese = nltk.wordpunct_tokenize('ഇതുഒരുസ്ഥാലമാണ്'.decode('utf8'))
for var in cheese:
    print var.encode('utf8'),
作为输出,我得到以下结果:

[u'\u0d07\u0d24\u0d4d\u0d12\u0d30\u0d41\u0d38\u0d4d\u0d25\u0d32\u0d02\u0d06\u0d23\u0d4d']
# encoding=utf-8

import nltk
cheese = nltk.wordpunct_tokenize('ഇതുഒരുസ്ഥാലമാണ്'.decode('utf8'))
for var in cheese:
    print var.encode('utf8'),
这与您想要的输出接近吗?我这里有点不清楚,因为如果不理解语言,就很难做到这一点。

可能有帮助吗


对另一个SO问题(以及其他高投票率的答案)的回答可能会有所帮助:

标记器确实是正确的工具;当然,这就是NLTK所说的。词法分析器(如您链接到的文章中所述)用于将单词分成更小的部分(词素)。但在示例代码中,您尝试使用适合英语的标记器:它识别空格分隔的单词和标点符号。因为Malayalam显然没有用空格或其他任何东西来表示单词边界,所以您需要一种不同的方法

因此NLTK没有提供任何检测马来语单词边界的功能。不过,它可能提供了相当容易构建一个像样的模型的工具

显而易见的方法是尝试字典查找:尝试将输入分解为字典中的字符串。但这比听起来更难:你需要一本非常大的词典,你仍然需要以某种方式处理未知的单词,而且由于马来语有非平凡的词法,你可能需要一个词法分析器来匹配词形变化的单词到词典。假设您可以使用字典存储或生成每个单词形式,那么您可以使用所述(并且@amp已经提到)的算法将输入划分为一个单词序列

更好的替代方法是使用统计算法,可以猜测单词边界在哪里。我不知道NLTK中有这样一个模块,但是中国人在这方面做了很多工作。如果值得你费心的话,你可以找到一个合适的算法并训练它在Malayalam上工作

简而言之:NLTK标记器只适用于英语的排版风格。您可以培训一个合适的工具来处理Malayalam,但据我所知,NLTK不包括这样的工具


注:NLTK确实提供了几种统计标记化工具;可以使用无监督学习算法(意味着您不需要在训练数据中标记边界)对句子进行训练以识别句子边界。不幸的是,它专门针对缩略语问题,因此无法适用于单词边界检测。

您的空格似乎是unicode字符
u'\u0d41'
。因此,您应该使用
str.split()
正常拆分

[out]:

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

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

在wikipedia()提供的语言速成课程结束后,您的问题和所需输出的工具中存在一些问题

合并任务

首先,OP融合了形态分析、分割和标记化的任务。通常,特别是土耳其语/马来亚拉姆语等土著语言之间存在细微的区别(参见)

粘合NLP和最佳实践

其次,我认为
标记器
不适用于马来语,一种粘性语言。作为NLP中研究最多的母语之一,土耳其语在“标记化”方面采取了不同的策略,他们发现需要一个完整的形态分析器(见www.andrew.cmu.edu/user/ko/downloads/lrec.pdf)‎). 

单词边界

标记化被定义为从表面文本中识别语言意义单位(LMU)(参见)不同的语言需要不同的标记器来识别不同语言的词边界。不同的人在寻找词边界方面有不同的方法,但总而言之,在NLP中,人们订阅了以下内容:

[u'\u0d07\u0d24\u0d4d\u0d12\u0d30\u0d41\u0d38\u0d4d\u0d25\u0d32\u0d02\u0d06\u0d23\u0d4d']
# encoding=utf-8

import nltk
cheese = nltk.wordpunct_tokenize('ഇതുഒരുസ്ഥാലമാണ്'.decode('utf8'))
for var in cheese:
    print var.encode('utf8'),
  • 粘合语言需要一个经过某种语言模型训练的成熟的形态分析器。识别什么是
    标记
    ,什么是语素级别,通常只有一层,因此NLP社区为各自的形态模型开发了不同的语言模型分析工具

  • 具有指定单词边界的多合成语言可以选择两层
    标记化
    ,系统可以首先识别一个孤立的单词,然后在必要时进行形态分析以获得更细粒度的标记。粗粒度标记器可以使用特定的分隔符拆分字符串(例如NLTK的
    word_tokenize
    punct_tokenize
    ,它使用空格/标点符号表示英语)。然后,为了在语素级别进行更精细的分析,人们通常会使用一些有限状态机将单词拆分为语素(例如德语)

  • 没有指定单词边界的多合成语言通常需要分词器首先在标记之间添加空格,因为正字法没有区分单词边界(例如汉语)。然后,如果需要,可以从分隔的标记中进行语素分析,以产生更细的颗粒标记(例如)。通常,这种细粒度代币与POS标签绑定

  • OP的请求/问题的简短回答是,OP在任务中使用了错误的工具:

    • 要为Malayalam输出
      标记
      ,必须有一个形态分析器,即N中的简单粗粒度标记器
      [('കേരളം<np><genitive>', 179)]
      
      conda install -c anaconda git
      
      git clone https://gitlab.com/smc/mlmorph.git