python不同的结果来自IDLE和python脚本

时间:2014-08-04 02:38:19

标签: python-2.7 unicode nltk tokenize

我在Python 2.7 shell中尝试了以下内容:

  >>> from nltk.stem.isri import ISRIStemmer
  >>> st = ISRIStemmer()
  >>> string = u'\u062D\u064E\u062F\u0651\u064E\u062B\u064E\u0646\u064E\u0627'
  >>> st.stem(string)
      u'\u062d\u062f\u062b'

所以基本上,我试图获得:

u'\u062d\u062f\u062b'

u'\u062D\u064E\u062F\u0651\u064E\u062B\u064E\u0646\u064E\u0627'

使用nltk的阿拉伯语词干分析器,它有效!

然而,当我尝试通过python脚本完成确切的事情时,它无法阻止列表中的任何单词,tokens

#!/c/Python27/python
# -*- coding: utf8 -*-

import nltk
import nltk.data
from nltk.stem.isri import ISRIStemmer

#In my script, I tokenize the following string
commasection = '\u0623\u064E\u062E\u0652\u0628\u064E\u0631\u064E\u0646\u064E\u0627 \u0628\u0650\u0634\u0652\u0631\u064F \u0628\u0652\u0646\u064F \u0647\u0650\u0644\u0627\u064E\u0644\u064D'

#The tokenizing works
tokens = nltk.word_tokenize(commasection)
st = ISRIStemmer()

for word in tokens:
    #But the stemming of each word in tokens doesn't work????
    print st.stem(word)

    #Should display 
    #u'u0623\u062e\u0628\u0631'
    #u'\u0628\u0634\u0631'
    #u'\u0628\u0646'
    #u'\u0647\u0644\u0644'

    #But it just shows whatever is in commasection

我需要我的python代码来阻止tokens中的所有单词。但我不知道在python shell中运行的简单示例是如何工作的,而不是这个脚本。

我注意到在shell场景中,有一个' u'在unicode序列的前面,所以我尝试了各种各样的编码/解码,并整晚阅读了很多关于它的事情(在这个上拉了一个全明星),但是这个python脚本并没有阻止word来自tokens,比如python shell !!!

如果有人可以帮助我让我的脚本显示正确的结果,我会超级赞赏

2 个答案:

答案 0 :(得分:1)

Unicode转义仅适用于unicode文字。

commasection = u'\u0623\u064E\u062E\u0652\u0628\u064E\u0631\u064E\u0646\u064E\u0627 \u0628\u0650\u0634\u0652\u0631\u064F \u0628\u0652\u0646\u064F \u0647\u0650\u0644\u0627\u064E\u0644\u064D'

答案 1 :(得分:0)

Ignacio是正确的,我必须有unicode文字才能使词干工作,但由于我动态地抓住这个字符串,我必须找到一种方法来转换我动态得到的东西

即。 '\u0623\u064E\u062E\u0652\u0628\u064E\u0631\u064E\u0646\u064E\u0627 \u0628\u0650\u0634\u0652\u0631\u064F \u0628\u0652\u0646\u064F \u0647\u0650\u0644\u0627\u064E\u0644\u064D'

进入带有unicode转义的字符串文字,即 u'\u0623\u064E\u062E\u0652\u0628\u064E\u0631\u064E\u0646\u064E\u0627 \u0628\u0650\u0634\u0652\u0631\u064F \u0628\u0652\u0646\u064F \u0647\u0650\u0644\u0627\u064E\u0644\u064D'

(注意前面的u

可以使用以下unichr()http://infohost.nmt.edu/tcc/help/pubs/python/web/unichr-function.html完成此操作:

word = "".join([unichr(int(x, 16)) for x in word.split("\\u") if x !=""])

所以基本上我抓住数字代码并形成unicode字符,同时保持unicode转义。我的主干工作了!