2017-10-05 68 views
0

在Python中使用split()函數後,表示阿拉伯語單詞時出現問題。我使用阿拉伯文字作爲輸入文件(您可以嘗試任何阿拉伯文來源)。在Python中使用split()函數後的阿拉伯語單詞表示

這裏是我的我在它的工作原代碼here

#!/usr/bin/env python 
# encoding: utf8 


from pprint import pprint 
from random import choice 
import codecs 



# ----------------------build deictionary-------------------------- 
EOS = ['.', '?', '!'] 
file=u'C:\python27\نجود.txt' 
fname = open(file, 'r') 
#file1=codecs.open(file , 'r', 'utf-8') 
text = fname.read() 
#text=file1.read() 
words = text.split() 
d = {} 
for i, word in enumerate(words): 
    try: 
     first, second, third = words[i], words[i + 1], words[i + 2] 
    except IndexError: 
     break 
    key = (first, second) 
    if key not in d: 
     d[key] = [] 
     # 
    d[key].append(third) 

pprint (d) 
    #for k, v in d.iteritems(): 
     # print k, v 
# -------------------------generate text--------------------------- 
li = [] 
first, second = key 
li.append(first) 
li.append(second) 
while True: 
    try: 

     third = choice(d[key]) 
    except KeyError: 
     break 
    li.append(third) 
    if third[-1] in EOS: 
     break 
    # else 
    key = (second, third) 
    first, second = key 

gtext = ' '.join(li) 
#decoded = gtext.decode('utf8') 
print "النص المنشأ:", gtext 
#file1.close() 

產生的輸出,我需要的是一樣的,如果我用英文輸入文件,它會是這樣:

{('He', 'is'): ['happy.', 
       'happy.', 
       'going.', 
       'sleep.', 
       'sad.', 
       'happy.', 
       'happy.', 
       'sleep.', 
       'angry.', 
       'angry.'], 
('angry.', 'He'): ['is', 'is'], 
('going.', 'He'): ['is'], 
('happy.', 'He'): ['is', 'is', 'is', 'is'], 
('is', 'angry.'): ['He', 'He'], 
('is', 'going.'): ['He'], 
('is', 'happy.'): ['He', 'He', 'He', 'He'], 
('is', 'sad.'): ['He'], 
('is', 'sleep.'): ['He', 'He'], 
('sad.', 'He'): ['is'], 
('sleep.', 'He'): ['is', 'is'], 
('He', 'is'): ['angry.']} 

但字樣看起來像不可讀的文字:

{('\xd8\xa3\xd9\x86\xd8\xa7', '\xd8\xa8\xd8\xb5\xd8\xaf\xd8\xaf'):['\xd8\xaa\xd8\xac\xd8\xb1\xd8\xa8\xd8\xa9'],('\xd8\xa7\xd9\x84\xd8\xa8\xd8\xb1\xd9\x86\xd8\xa7\xd9\x85\xd8\xac','\xd9\x81\xd9\x8a'): ['\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86.'('\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a', '\xd8\xb3\xd8\xaa\xd9\x83\xd9\x88\xd9\x86'): ['\xd9\x85\xd8\xae\xd8\xaa\xd9\x84\xd9\x81\xd8\xa9.'],('\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86','\xd8\xb1\xd8\xa7\xd8\xa6\xd8\xb9'): ['\xd9\x88\xd8\xac\xd9\x85\xd9\x8a\xd9\x84,','\xd9\x88\xd9\x8a\xd8\xb3\xd8\xaa\xd8\xad\xd9\x82'],('\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86','\xd9\x85\xd8\xb9'): ['\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a'('\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86.', '\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86'): ['\xd8\xb1\xd8\xa7\xd8\xa6\xd8\xb9'],('\xd8\xa8\xd8\xb5\xd8\xaf\xd8\xaf', '\xd8\xaa\xd8\xac\xd8\xb1\xd8\xa8\xd8\xa9'): ['\xd9\x87\xd8\xb0\xd8\xa7'],('\xd8\xaa\xd8\xac\xd8\xb1\xd8\xa8\xd8\xa9', '\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86'): ['\xd9\x85\xd8\xb9'],('\xd8\xaa\xd8\xac\xd8\xb1\xd8\xa8\xd8\xa9', '\xd9\x87\xd8\xb0\xd8\xa7'): ['\xd8\xa7\xd9\x84\xd8\xa8\xd8\xb1\xd9\x86\xd8\xa7\xd9\x85\xd8\xac'],('\xd8\xb1\xd8\xa7\xd8\xa6\xd8\xb9', '\xd9\x88\xd8\xac\xd9\x85\xd9\x8a\xd9\x84,'): ['\xd9\x88\xd9\x84\xd9\x83\xd9\x86'],('\xd8\xb1\xd8\xa7\xd8\xa6\xd8\xb9', '\xd9\x88\xd9\x8a\xd8\xb3\xd8\xaa\xd8\xad\xd9\x82'): ['\xd8\xa7\xd9\x84\xd8\xaa\xd8\xac\xd8\xb1\xd8\xa8\xd8\xa9.'],('\xd8\xb3\xd8\xaa\xd9\x83\xd9\x88\xd9\x86', '\xd9\x85\xd8\xae\xd8\xaa\xd9\x84\xd9\x81\xd8\xa9.'): ['\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86'],('\xd8\xb9\xd9\x84\xd9\x8a\xd9\x83\xd9\x85', '\xd8\xa3\xd9\x86\xd8\xa7'): ['\xd8\xa8\xd8\xb5\xd8\xaf\xd8\xaf'],('\xd9\x81\xd9\x8a', '\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86.'): ['\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86'],('\xd9\x85\xd8\xae\xd8\xaa\xd9\x84\xd9\x81\xd8\xa9.', '\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86'): ['\xd8\xb1\xd8\xa7\xd8\xa6\xd8\xb9'],('\xd9\x85\xd8\xb9', '\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a'): ['\xd8\xb3\xd8\xaa\xd9\x83\xd9\x88\xd9\x86'],('\xd9\x87\xd8\xb0\xd8\xa7', '\xd8\xa7\xd9\x84\xd8\xa8\xd8\xb1\xd9\x86\xd8\xa7\xd9\x85\xd8\xac'): ['\xd9\x81\xd9\x8a'],('\xd9\x88\xd8\xac\xd9\x85\xd9\x8a\xd9\x84,', '\xd9\x88\xd9\x84\xd9\x83\xd9\x86'): ['\xd8\xaa\xd8\xac\xd8\xb1\xd8\xa8\xd8\xa9'],('\xd9\x88\xd9\x84\xd9\x83\xd9\x86', '\xd8\xaa\xd8\xac\xd8\xb1\xd8\xa8\xd8\xa9'): ['\xd8\xa8\xd8\xa7\xd9\x8a\xd8\xab\xd9\x88\xd9\x86'],('\xef\xbb\xbf\xd8\xa7\xd9\x84\xd8\xb3\xd9\x84\xd8\xa7\xd9\x85', '\xd8\xb9\xd9\x84\xd9\x8a\xd9\x83\xd9\x85'): ['\xd8\xa3\xd9\x86\xd8\xa7']} 

或者像這樣如果Python的3:

{('ï»؟ط§ظ„ط³ظ„ط§ظ…', 'ط¹ظ„ظٹظƒظ…'): ['ط£ظ†ط§'], 
('ط£ظ†ط§', 'ط¨طµط¯ط¯'): ['طھط¬ط±ط¨ط©'], 
('ط§ظ„ط¨ط±ظ†ط§ظ…ط¬', 'ظپظٹ'): ['ط¨ط§ظٹط«ظˆظ†.'], 
('ط§ظ„ط¹ط±ط¨ظٹ', 'ط³طھظƒظˆظ†'): ['ظ…ط®طھظ„ظپط©.'], 
('ط¨ط§ظٹط«ظˆظ†', 'ط±ط§ط¦ط¹'): ['ظˆط¬ظ…ظٹظ„,', 'ظˆظٹط³طھط\xadظ‚'], 
('ط¨ط§ظٹط«ظˆظ†', 'ظ…ط¹'): ['ط§ظ„ط¹ط±ط¨ظٹ'], 
('ط¨ط§ظٹط«ظˆظ†.', 'ط¨ط§ظٹط«ظˆظ†'): ['ط±ط§ط¦ط¹'], 
('ط¨طµط¯ط¯', 'طھط¬ط±ط¨ط©'): ['ظ‡ط°ط§'], 
('ط±ط§ط¦ط¹', 'ظˆط¬ظ…ظٹظ„,'): ['ظˆظ„ظƒظ†'], 
('ط±ط§ط¦ط¹', 'ظˆظٹط³طھط\xadظ‚'): ['ط§ظ„طھط¬ط±ط¨ط©.'], 
('ط³طھظƒظˆظ†', 'ظ…ط®طھظ„ظپط©.'): ['ط¨ط§ظٹط«ظˆظ†'], 
('ط¹ظ„ظٹظƒظ…', 'ط£ظ†ط§'): ['ط¨طµط¯ط¯'], 
('طھط¬ط±ط¨ط©', 'ط¨ط§ظٹط«ظˆظ†'): ['ظ…ط¹'], 
('طھط¬ط±ط¨ط©', 'ظ‡ط°ط§'): ['ط§ظ„ط¨ط±ظ†ط§ظ…ط¬'], 
('ظˆط¬ظ…ظٹظ„,', 'ظˆظ„ظƒظ†'): ['طھط¬ط±ط¨ط©'], 
('ظˆظ„ظƒظ†', 'طھط¬ط±ط¨ط©'): ['ط¨ط§ظٹط«ظˆظ†'], 
('ظپظٹ', 'ط¨ط§ظٹط«ظˆظ†.'): ['ط¨ط§ظٹط«ظˆظ†'], 
('ظ‡ط°ط§', 'ط§ظ„ط¨ط±ظ†ط§ظ…ط¬'): ['ظپظٹ'], 
('ظ…ط®طھظ„ظپط©.', 'ط¨ط§ظٹط«ظˆظ†'): ['ط±ط§ط¦ط¹'], 
('ظ…ط¹', 'ط§ظ„ط¹ط±ط¨ظٹ'): ['ط³طھظƒظˆظ†']} 

我已經嘗試了多種解決方案,目前仍是問題尚未解決

我想:

解決方案1:

stack= d.items() 
    while stack: 
     k, v = stack.pop() 
     if isinstance(v, dict): 
      stack.extend(v.iteritems()) 
     else: 
      output= "%s: %s" % (k, v) 
      print output.decode('utf8') 

解決方案2:

for k, v in d.items(): 
     print k, v 

解決方案3:

for k, v in d.keys(): 
    print k, v 
    for attribute, value in d.items(): 
     print('{} : {}'.format(attribute, value)) 

解決方案4:

words = text.split() 
    uniwords= unicode(words) 
    print uniwords 

,但問題仍然存在。此外,我嘗試codecs模塊,但仍然打印如上面的輸出。只有當我使用文件I/O而不是普通文本時,纔會出現此問題。

所以我需要的是,如果我打印拆分功能,它應該用英文例子中的阿拉伯文字打印。

+0

問題是字符串的'repr'顯示爲一個字節序列? – timgeb

+0

我需要的輸出如果我使用split()函數我想在輸出中看到單詞是阿拉伯詞,而不是上面的輸出。 –

+0

'print'\ xd8 \ xa8 \ xd8 \ xb5 \ xd8 \ xaf \ xd8 \ xaf'.decode('utf-8')'顯示'بصدد'。 – timgeb

回答

1

在python3中,您需要將fname = open(file, 'r')更改爲fname = open(file, 'r', encoding='utf-8')


例子:運行在你的文件下面的代碼:

with open('/tmp/test.txt', 'r', encoding='utf-8') as f: 
    l = f.read() 
    print(l.split()) 

你會得到分開單詞的列表,通過" "

0

的Python試圖打開該文件與您的默認操作系統編碼,而文件可能是用UTF-8編碼的。你需要:

open('...', 'r', encoding='utf-8') 

另外,除非你有一個很好的理由,儘量遠離Python 2.7。使用unicode字符串很困難。