Python 中字符串转 unicode 再切成列表这两个操作有一个不合逻辑的地方

2015-01-19 12:05:16 +08:00
 zeroday
在 MOOC 上学习 Python,关于中文分词问题,按老师说的正向最大匹配分词的思路,写了一个程序。

这是第一次写的,运行结果和期望的不一样。

( )

仔细看了一下代码,没发现任何问题。
后来我对代码做了一些修改,仅仅是调了一下代码的位置

( )

现在运行结果和期望相符了。

这里我对输入的字符串进行两个处理:
字符串转unicode
字符串根据空格切分成列表

奇怪的是,我将这两个处理提取出来,传入给函数处理好的值,然后运行程序,得到的却不是我期望的结果
而同样的操作,在两个函数中分别进行处理却得到期望的结果。

代码是不变的,我只是调换了处理的先后顺序,而运行结果却出人意料,请问是怎么回事呢?
2618 次点击
所在节点    Python
9 条回复
skyline75489
2015-01-19 12:22:20 +08:00
图片看不清啊同学。。。
hahastudio
2015-01-19 12:37:37 +08:00
sen 没做处理
zeroday
2015-01-19 13:48:21 +08:00
@skyline75489 不好意思,我图截大了,右键打开图片可以放大的。
zeroday
2015-01-19 13:49:57 +08:00
@hahastudio sen 不是在下面处理了呢?
proudzhu
2015-01-19 14:31:14 +08:00
分词我不懂,不过 word_max_len 这个函数的输入参数你搞清楚了吗?
为啥定义输入个 my_dict,结果调用的时候传个 sen ?
hahastudio
2015-01-19 14:45:47 +08:00
@zeroday 第一张图片里 sen 没处理,只转换了 my_dict
Sylv
2015-01-19 17:13:31 +08:00
就是因为图一的 word_max_len 没将输入解码成 unicode,而中文的 str 和 unicode 的 len 是不同的,unicode 的 len 才是中文正确的 len。
zeroday
2015-01-20 09:14:41 +08:00
@proudzhu
@hahastudio
@Sylv
明白了,原来问题在后面的代码中, word_max_len 传错参数。
zeroday
2015-01-20 09:29:11 +08:00
@proudzhu 分词的思路是这样的,按 append 中逆向最大匹配分词的思路来说。

首先需要有一个字典对切分的单词作匹配。比如类似图中的:
你 我 他 爱 北京 天安门 研究 研究生 命 生命 的 起源

然后传入一个句子进行切分单词,同时定义一个列表来存放匹配成功后的词,比如
研究生命的起源

我们从句子的末尾进行匹配。因为字典词的最大长度为 3,故我们先匹配的词为末尾三个字符,即
的起源

“的起源”不在字典中,故改变词的长度,变为长度2,匹配的词则变为
起源

“起源”在字典中,匹配成功,则存入列表中。

然后句子从“生命的”开始,继续匹配。

如果句子中有列表中不存在的词,则将单个汉字作为词存入列表。

这样,最后匹配的结果为:
研究 生命 的 起源

匹配的结果比图片中正向最大匹配分词更为正确。(正向最大分词的思路和逆向差不多,区别是从头开始匹配)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/163424

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX