V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zeroday
V2EX  ›  Python

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

  •  
  •   zeroday · 2015-01-19 12:05:16 +08:00 · 2699 次点击
    这是一个创建于 3603 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 MOOC 上学习 Python,关于中文分词问题,按老师说的正向最大匹配分词的思路,写了一个程序。

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

    ( )

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

    ( )

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

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

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

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

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

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

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

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

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

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

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

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

    匹配的结果比图片中正向最大匹配分词更为正确。(正向最大分词的思路和逆向差不多,区别是从头开始匹配)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1110 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:49 · PVG 07:49 · LAX 15:49 · JFK 18:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.