2013-11-03 66 views
0

我想要統計以UTF-8格式保存的Urdu文檔中相同單詞的數量。在python中比較unicode和unicode

所以例如我已經含有3個由空格隔開完全相同詞語文件

خُداوند خُداوند خُداوند 

我試圖通過使用以下代碼讀取文件來算的話:

 file_obj = codecs.open(path,encoding="utf-8") 
     lst = repr(file_obj.readline()).split(" ") 
     word = lst[0] 
     count =0 
     for w in lst: 
      if word == w: 
       count += 1 
     print count 

但該值計數我得到是1,而我應該得到3.

如何比較Unicode字符串?

+1

lst'打印爲什麼?我有''u'\ u062e \ u0646 \ u062f',u'\ u062e \ u064f \ u062f \ u0627 \ u0648 \ u0646 \ u062f',u'\ u062e \ u064f \ u062f \ u0627 \ u0648 \ u0646 \ u062f']'和那些完全相同(您的代碼工作)。但是如果有任何非規範化的形式,那麼它們將不會完全相同。 –

+0

請參閱[規範化Unicode](http://stackoverflow.com/q/16467479),瞭解使用非規範化代碼點處理Unicode值的正確方法。 –

+0

並刪除'repr()'。你剛剛在字符串的開始和結尾添加了'u''和'''。所以'word'現在是''u'\ u062e \ u0646 \ u062f \ u0648 \ u0646 \ u062f','lst [1]'是''\ u062e \ u064f \ u062f \ u0627 \ u0648 \ u0646 \ u062f' '和'list [2]'是''\ u062e \ u0646 \ u062f \ u0627 \ u0646 \ u062f'''。這些字符串顯然*不等於。 –

回答

3

從你的代碼中刪除repr()。僅使用repr()來創建調試輸出;你將一個unicode值轉換成一個可以粘貼回解釋器的字符串。

這意味着從該文件的行現在被存儲爲:

>>> repr(u'خُداوند خُداوند خُداوند\n').split(" ") 
["u'\\u062e\\u064f\\u062f\\u0627\\u0648\\u0646\\u062f", '\\u062e\\u064f\\u062f\\u0627\\u0648\\u0646\\u062f', "\\u062e\\u064f\\u062f\\u0627\\u0648\\u0646\\u062f\\n'"] 

注意反斜槓(轉義Unicode轉義)和第一串u'開始,最後一個字符串與\\n'結束。這些值顯然不相等。

取出repr(),並使用.split()不帶參數去除尾隨空白太多:

lst = file_obj.readline().split() 

,你的代碼將工作:

>>> res = u'خُداوند خُداوند خُداوند\n'.split() 
>>> res[0] == res[1] == res[2] 
True 

您可能需要正常化的先輸入;一些字符可以表示爲一個unicode碼點或者兩個合併碼點。規範化將所有這些字符移動到組合或分解狀態。見Normalizing Unicode

1

嘗試清除repr

lst = file_obj.readline().split(" ") 

的一點是,你至少應該print變量,如lstw,看看它們是什麼。

+0

即使*帶''repr()'示例輸入仍然有效;當然OP不應該使用它,但是。 –

+0

啊,不,第一個字符串會有'u'',第二個沒有引號,第三個是''''。 –

+0

@MartijnPieters是的,我已經嘗試過,然後我發佈;) – satoru

0

比較Unicode字符串在Python:

a = u'Artur' 
print(a) 
b = u'\u0041rtur' 
print(b) 

if a == b: 
    print('the same') 

結果:

Artur 
Artur 
the same