Python中文分句问题

网上看见一段用Python写的中文分句代码,在Win XP、Python2.7中运行出错,提示“NameError: global name 'FindTok' is not defined ”,不知该如何修改,请教于大家!
另外,如果想处理某个文件夹下的全部文件该怎么修改?
谢谢!

(“附件” 中的代码含有正确的缩进格式,为方便上传,特将“.py”后缀改成了“.txt”,改回至“.py”后缀可运行)

代码如下(此代码格式不正确,没有缩进):

[xcode=python]
def Cut(cutlist, lines):
l = []
line = []
for i in lines:
if FindTok(cutlist,i):
l.append("".join(line))
l.append(i)
line = []
else:
line.append(i)
return l

cutlist = "[。,,!……!《》<>\"'::?\?、\|“”‘’;]{}(){}【】(){}():?!。,;、~——+%%`:“”"'‘\n\r".decode('gbk')
for lines in file(inputfilename):
l = Cut(list(cutlist),list(lines.decode('gbk')))
for line in l:
if line.strip() <> "": #这里可能包含空格
li = line.strip().split()
for sentence in li:
print "se:",sentence
[/xcode]

代码所在网页:http://www.oschina.net/code/snippet_16840_2007
 

附件

  • chn_cutter.txt
    716 bytes · 浏览: 11
Last edited by a moderator:
回复: Python中文分句问题

Seems that FindTok is a module that you need to import before using it.
 
回复: Python中文分句问题

Seems that FindTok is a module that you need to import before using it.

谢谢Haiyang,回老家过年了,刚看到回复,年后试后再给大家反馈。
祝广大C友蛇年快乐,身体健康,阖家幸福,万事如意!
 
回复: Python中文分句问题

尝试过import re/os/sys等,问题照旧,可能是Python2.7中已经没有FindTok函数,抑或是这段代码本身就有问题。
 
回复: Python中文分句问题

You might want to look into Stanford Parser. It is capable of parsing Chinese sentences.
 
回复: Python中文分句问题

谢谢aarondeng!谢谢Haiyang!
改成findToken后还是“NameError: global name 'FindToken' is not defined ”,甚至改成find、findall等后还是提示类似错误。 find /findall应该是内置函数啊,不需要定义吧?!
只想对中文进行分句处理,以方便英汉对齐,不需要标注的,Stanford Parser好像不行。
 
回复: Python中文分句问题

仅仅是切分句子的话,如果不是要求百分百准确,应该不难实现吧?楼主既然会python,可以考虑自己用python弄一下。就用split函数估计就能够满足基本需要
 
回复: Python中文分句问题

实现汉语句子大体切分倒不难,如editpad的正则表达式或录制宏、word的vba等。我不懂python,只是最近在看这类书籍;python的split可以基本实现句子切分,但切分后,句末的标点符号(如。?!)会丢失。
 
回复: Python中文分句问题

如果确实需要这些标点符号进行分析,可以在切分之后,加代码补回去啊。
 
回复: Python中文分句问题

如果把标点符号补回去的话,还是用editpad或word切分句子更直接、工作量更小些。
 
回复: Python中文分句问题

如果把标点符号补回去的话,还是用editpad或word切分句子更直接、工作量更小些。

呵呵,所谓补回去,应该也就是加一两句代码的事情。 用循环体。

程序是可以批量完成的。
如果语料库不大的话,几乎不能感觉出时间差异。
 
回复: Python中文分句问题

def FindTok(cutlist, char):
if char in cutlist:
return True
else:
return False

谢谢zhengyihzw!
修改后,原来的错误没了,但出现如下错误:

Traceback (most recent call last):
File "C:\Python27\chn_cutter2.py", line 23, in <module>
for line in l:
TypeError: 'NoneType' object is not iterable

不知该在哪里加return返回什么值才能迭代?
 
回复: Python中文分句问题

[xcode=python]
def FindTok(cutlist, char):
if char in cutlist:
return True
else:
return False

def Cut(cutlist,lines):
l = []
line = []

for i in lines:
if FindTok(cutlist,i):
l.append("".join(line))
l.append(i)
line = []
else:
line.append(i)
return l

cutlist ="[。,,!……!《》<>\"'::?\?、\|“”‘’;]{}(){}【】(){}():?!。,;、~——+%%`:“”"'‘\n\r".decode('utf-8')
for lines in file("test.txt"):
l = Cut(list(cutlist),list(lines.decode('gbk')))
for line in l:
if line.strip() <> "":#这里可能包含空格
li = line.strip().split()
for sentence in li:
print "se:",sentence


[/xcode]
 
Last edited:
回复: Python中文分句问题

终于能运行了,感谢aarondeng、zhengyihzw、Haiyang等的帮助!提醒下,这段代码本身应该存为utf8的编码格式。

这段代码把中文段落分成了以下效果:
se: 在
se: “
se: 开始
se: ”
se: 选项卡上
se: ,
se: 通过从快速样式库中为所选文本选择一种外观
se: ,
se: 您可以方便地更改文档中所选文本的格式
se: 。
se: 您还可以使用
se: “
se: 开始
se: ”
se: 选项卡上的其他控件来直接设置文本格式
se: 。
se: 大多数控件都允许您选择是使用当前主题外观
se: ,
se: 还是使用某种直接指定的格式
se: 。

而我期望的效果应该是中文分句,一个句子一行,如:
[FONT=宋体]在[/FONT][FONT=宋体]开始[/FONT][FONT=宋体]选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。[/FONT]
[FONT=宋体]您还可以使用[/FONT][FONT=宋体]开始[/FONT][FONT=宋体]选项卡上的其他控件来直接设置文本格式。[/FONT]
[FONT=宋体]大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。[/FONT]

不过,还是十分感谢大家的帮助!
 
Back
顶部