在Python中使用split()函数后的阿拉伯语单词表示
问题描述:
在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而不是普通文本时,才会出现此问题。
所以我需要的是,如果我打印拆分功能,它应该用英文例子中的阿拉伯文字打印。
答
在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())
你会得到分开单词的列表,通过" "
答
的Python试图打开该文件与您的默认操作系统编码,而文件可能是用UTF-8编码的。你需要:
open('...', 'r', encoding='utf-8')
另外,除非你有一个很好的理由,尽量远离Python 2.7。使用unicode字符串很困难。
问题是字符串的'repr'显示为一个字节序列? – timgeb
我需要的输出如果我使用split()函数我想在输出中看到单词是阿拉伯词,而不是上面的输出。 –
'print'\ xd8 \ xa8 \ xd8 \ xb5 \ xd8 \ xaf \ xd8 \ xaf'.decode('utf-8')'显示'بصدد'。 – timgeb