Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String_Unicode_Nlp_Cjk - Fatal编程技术网

Python 如何在不使用';不使用空格作为单词分隔符吗?

Python 如何在不使用';不使用空格作为单词分隔符吗?,python,string,unicode,nlp,cjk,Python,String,Unicode,Nlp,Cjk,我想把一个句子分成一系列单词 对于英语和欧洲语言,这很简单,只需使用split() 但我也需要处理一些语言中的句子,比如汉语,它们不使用空格作为分词符 >>> u"这是一个句子".split() [u'\u8fd9\u662f\u4e00\u4e2a\u53e5\u5b50'] 显然,这是行不通的 我如何将这样一个句子拆分成一个单词列表 更新: 到目前为止,答案似乎表明这需要自然语言处理技术,而且汉语中的单词边界是模糊的。我不知道为什么。在我看来,汉语中的词界是非常明确的。每

我想把一个句子分成一系列单词

对于英语和欧洲语言,这很简单,只需使用split()

但我也需要处理一些语言中的句子,比如汉语,它们不使用空格作为分词符

>>> u"这是一个句子".split()
[u'\u8fd9\u662f\u4e00\u4e2a\u53e5\u5b50']
显然,这是行不通的

我如何将这样一个句子拆分成一个单词列表

更新:

到目前为止,答案似乎表明这需要自然语言处理技术,而且汉语中的单词边界是模糊的。我不知道为什么。在我看来,汉语中的词界是非常明确的。每个中文单词/字符都有一个对应的unicode,并在屏幕上显示为一个单独的单词/字符

那么,这种歧义从何而来呢。正如您在我的Python控制台输出中所看到的,Python可以很好地说明我的示例语句由5个字符组成:

这 - u8fd9
是 - u662f
一 - u4e00
个 - u4e2a
句 - u53e5
子 - u5b50

因此,很明显,Python在确定单词/字符边界方面没有问题。我只需要列表中的这些单词/字符。

您可以这样做,但不能使用标准库函数。正则表达式也帮不了你

您正在描述的任务是名为(NLP)的字段的一部分。在分词方面已经做了很多工作。我建议您使用这些现有的解决方案之一,而不是尝试推出自己的解决方案

这种模糊性是从哪里来的

你在上面列出的是汉字。这与英语中的字母或音节大致相同(但与NullUserException在评论中指出的不同)。关于角色边界的位置没有任何歧义-这是非常明确的定义。但你要求的不是人物界限,而是文字界限。中文单词可以由多个字符组成

如果您只想找到字符,那么这非常简单,不需要NLP库。只需将消息解码为unicode字符串(如果尚未完成),然后通过调用内置函数
list
将unicode字符串转换为列表。这将为您提供字符串中的字符列表。对于您的具体示例:

>>> list(u"这是一个句子")

日语部分是可能的,因为你通常在单词的开头和结尾有不同的字符类别,但是有关于这个主题的完整的中文科学论文。如果你感兴趣的话,我有一个正则表达式用于拆分日语中的单词:

像中文这样的语言对单词的定义非常流畅。例如,
ma
的一个意思是“马”。商的一个意思是“在上面”或“在上面”。复合词是“马上”,字面意思是“骑在马上”,但比喻为“立即”。你需要一个很好的字典,里面有复合词,查找字典需要一个最长的匹配方法。复合词在德语中很流行(著名的例子是“多瑙河蒸汽导航公司董事的妻子”用一个词来表达)、突厥语、芬兰语和马加尔语——这些语言都有很长的单词,很多单词在词典中找不到,需要分解才能理解

你的问题是语言学问题,与Python无关。

试试这个:

好的,我知道了

只需使用list()即可完成我需要的操作:


感谢您的所有输入。

请注意:使用
列表(“…”)
(在Py3中;对于Py2,这是
u“…”
)在一般意义上不会给出unicode字符串的字符;相反,它很可能会产生一系列16位代码点。这适用于所有“狭义”CPython构建,它占据了当今绝大多数python安装

当unicode在20世纪90年代首次被提出时,有人认为16位足以满足通用文本编码的所有需求,因为它可以将128个码点(7位)和256个码点(8位)移动到高达65'536个码点。然而,很快就很明显,这是一厢情愿的想法;今天,unicode版本5.2中定义了大约10万个代码点,还有数千个代码点有待纳入。为了实现这一点,unicode必须从16位移动到(概念上)32位(尽管它没有充分利用32位地址空间)

为了保持与基于unicode仍然是16位的假设而构建的软件的兼容性,设计了所谓的代理对,其中使用来自特定指定块的两个16位代码点来表示65’536以外的代码点,即unicode所称的“基本多语言平面”或BMP以外的代码点,它们被戏称为该编码的“星体”层面,因为它们相对难以捉摸,并且给文本处理和编码领域的工作人员带来了持续的头痛

现在,虽然窄CPython在某些情况下非常透明地处理代理项对,但在其他情况下,它仍然无法做正确的事情,字符串拆分是更麻烦的情况之一。在狭窄的python构建中,
list('abc大 列表()是纯中文句子的答案。对于大多数情况下的中英文混合语。它的答案是,只需从下面复制答案即可

def spliteKeyWord(str):
    regex = r"[\u4e00-\ufaff]|[0-9]+|[a-zA-Z]+\'*[a-z]*"
    matches = re.findall(regex, str, re.UNICODE)
    return matches

最好的中文标记工具是pynlpir

import pynlpir
pynlpir.open()
mystring = "你汉语说的很好!"
tokenized_string = pynlpir.segment(mystring, pos_tagging=False)

>>> tokenized_string
['你', '汉语', '说', '的', '很', '好', '!']
请注意,pynlpir在许可方面有一个臭名昭著但容易解决的问题,您可以在internet上找到很多解决方案。 您只需更换NLPIR文件夹中的NLPIR.user文件,从该文件夹下载valide许可证,然后重新启动环境

如果str长度超过30,则取27个字符,并在末尾添加“…”
否则返回str

str='1〕中文2018-2020年一
def spliteKeyWord(str):
    regex = r"[\u4e00-\ufaff]|[0-9]+|[a-zA-Z]+\'*[a-z]*"
    matches = re.findall(regex, str, re.UNICODE)
    return matches
import pynlpir
pynlpir.open()
mystring = "你汉语说的很好!"
tokenized_string = pynlpir.segment(mystring, pos_tagging=False)

>>> tokenized_string
['你', '汉语', '说', '的', '很', '好', '!']