我一直在尝试为句子拆分编写代码。它在英语和其他从左到右的拉丁字母语言中都非常有效。当我尝试使用阿拉伯语进行相同操作时,文本完全断开,就像每个字母都一样。我不确定是什么问题。
我的输入文字:
عندمايريدالعالمأنيتكلّم,فهويتحدّثبلغةيونيكود。 سجّلالآنلحضورالمؤتمرالدوليالعاشرليونيكود,الذيسيعقدفيآذاربمدينةمَايِنْتْس,ألمانيا。 وسيجمعالمؤتمربينخبراءمنكافةقطاعاتالصناعةعلىالشبكةالعالميةانترنيتويونيكود,حيثستتم,علىالصعيدينالدوليوالمحليعلىحدسواءمناقشةسبلاستخداميونكودفيالنظمالقائمةوفيمايخصالتطبيقاتالحاسوبية,الخطوط,تصميمالنصوصوالحوسبةمتعددةاللغات。
我的代码:
# -*- coding: utf-8 -*-
import nltk
from nltk import sent_tokenize
import codecs
import csv
sentences = codecs.open('SampleArabic.txt', 'r', 'utf-8-sig').read()
def split_sentences(sentences):
with codecs.open('Output_AR.txt', 'w', encoding='utf-8') as writer:
newcount = 0
for sent in sent_tokenize(sentences):
print(sent.encode('utf-8'))
wr = csv.writer(writer,delimiter='\n')
wr.writerow(str(sent))
newcount = sentences.count(sentences)+newcount
print(newcount)
pass
split_sentences(sentences)
我的第一个问题是控制台以代码形式打印文本:
b'\xd8\xb9\xd9\x86\xd8\xaf\xd9\x85\xd8\xa7 \xd9\x8a\xd8\xb1\xd9\x8a\xd8\xaf \xd8\xa7\xd9\x84\xd8\xb9\xd8\xa7\xd9\x84\xd9\x85 \xd8\xa3\xd9\x86 \xd9\x8a\xd8\xaa\xd9\x83\xd9\x84\xd9\x91\xd9\x85 \xe2\x80\xac \xd8\x8c \xd9\x81\xd9\x87\xd9\x88 \xd9\x8a\xd8\xaa\xd8\xad\xd8\xaf\xd9\x91\xd8\xab \xd8\xa8\xd9\x84\xd8\xba\xd8\xa9 \xd9\x8a\xd9\x88\xd9\x86\xd9\x8a\xd9\x83\xd9\x88\xd8\xaf.'
b'\xd8\xb3\xd8\xac\xd9\x91\xd9\x84 \xd8\xa7\xd9\x84\xd8\xa2\xd9\x86 \xd9\x84\xd8\xad\xd8\xb6\xd9\x88\xd8\xb1 \xd8\xa7\xd9\x84\xd9\x85\xd8\xa4\xd8\xaa\xd9\x85\xd8\xb1 \xd8\xa7\xd9\x84\xd8\xaf\xd9\x88\xd9\x84\xd9\x8a \xd8\xa7\xd9\x84\xd8\xb9\xd8\xa7\xd8\xb4\xd8\xb1 \xd9\x84\xd9\x8a\xd9\x88\xd9\x86\xd9\x8a\xd9\x83\xd9\x88\xd8\xaf\xd8\x8c \xd8\xa7\xd9\x84\xd8\xb0\xd9\x8a \xd8\xb3\xd9\x8a\xd8\xb9\xd9\x82\xd8\xaf \xd9\x81\xd9\x8a \xd8\xa2\xd8\xb0\xd8\xa7\xd8\xb1 \xd8\xa8\xd9\x85\xd8\xaf\xd9\x8a\xd9\x86\xd8\xa9 \xd9\x85\xd9\x8e\xd8\xa7\xd9\x8a\xd9\x90\xd9\x86\xd9\x92\xd8\xaa\xd9\x92\xd8\xb3\xd8\x8c \xd8\xa3\xd9\x84\xd9\x85\xd8\xa7\xd9\x86\xd9\x8a\xd8\xa7.'
b'\xd9\x88 \xd8\xb3\xd9\x8a\xd8\xac\xd9\x85\xd8\xb9 \xd8\xa7\xd9\x84\xd9\x85\xd8\xa4\xd8\xaa\xd9\x85\xd8\xb1 \xd8\xa8\xd9\x8a\xd9\x86 \xd8\xae\xd8\xa8\xd8\xb1\xd8\xa7\xd8\xa1 \xd9\x85\xd9\x86 \xd9\x83\xd8\xa7\xd9\x81\xd8\xa9 \xd9\x82\xd8\xb7\xd8\xa7\xd8\xb9\xd8\xa7\xd8\xaa \xd8\xa7\xd9\x84\xd8\xb5\xd9\x86\xd8\xa7\xd8\xb9\xd8\xa9 \xd8\xb9\xd9\x84\xd9\x89 \xd8\xa7\xd9\x84\xd8\xb4\xd8\xa8\xd9\x83\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb9\xd8\xa7\xd9\x84\xd9\x85\xd9\x8a\xd8\xa9 \xd8\xa7\xd9\x86\xd8\xaa\xd8\xb1\xd9\x86\xd9\x8a\xd8\xaa \xd9\x88\xd9\x8a\xd9\x88\xd9\x86\xd9\x8a\xd9\x83\xd9\x88\xd8\xaf\xd8\x8c \xd8\xad\xd9\x8a\xd8\xab \xd8\xb3\xd8\xaa\xd8\xaa\xd9\x85\xd8\x8c \xd8\xb9\xd9\x84\xd9\x89 \xd8\xa7\xd9\x84\xd8\xb5\xd8\xb9\xd9\x8a\xd8\xaf\xd9\x8a\xd9\x86 \xd8\xa7\xd9\x84\xd8\xaf\xd9\x88\xd9\x84\xd9\x8a \xd9\x88\xd8\xa7\xd9\x84\xd9\x85\xd8\xad\xd9\x84\xd9\x8a \xd8\xb9\xd9\x84\xd9\x89 \xd8\xad\xd8\xaf \xd8\xb3\xd9\x88\xd8\xa7\xd8\xa1 \xd9\x85\xd9\x86\xd8\xa7\xd9\x82\xd8\xb4\xd8\xa9 \xd8\xb3\xd8\xa8\xd9\x84 \xd8\xa7\xd8\xb3\xd8\xaa\xd8\xae\xd8\xaf\xd8\xa7\xd9\x85 \xd9\x8a\xd9\x88\xd9\x86\xd9\x83\xd9\x88\xd8\xaf \xd9\x81\xd9\x8a \xd8\xa7\xd9\x84\xd9\x86\xd8\xb8\xd9\x85 \xd8\xa7\xd9\x84\xd9\x82\xd8\xa7\xd8\xa6\xd9\x85\xd8\xa9 \xd9\x88\xd9\x81\xd9\x8a\xd9\x85\xd8\xa7 \xd9\x8a\xd8\xae\xd8\xb5 \xd8\xa7\xd9\x84\xd8\xaa\xd8\xb7\xd8\xa8\xd9\x8a\xd9\x82\xd8\xa7\xd8\xaa \xd8\xa7\xd9\x84\xd8\xad\xd8\xa7\xd8\xb3\xd9\x88\xd8\xa8\xd9\x8a\xd8\xa9\xd8\x8c \xd8\xa7\xd9\x84\xd8\xae\xd8\xb7\xd9\x88\xd8\xb7\xd8\x8c \xd8\xaa\xd8\xb5\xd9\x85\xd9\x8a\xd9\x85 \xd8\xa7\xd9\x84\xd9\x86\xd8\xb5\xd9\x88\xd8\xb5 \xd9\x88\xd8\xa7\xd9\x84\xd8\xad\xd9\x88\xd8\xb3\xd8\xa8\xd8\xa9 \xd9\x85\xd8\xaa\xd8\xb9\xd8\xaf\xd8\xaf\xd8\xa9 \xd8\xa7\xd9\x84\xd9\x84\xd8\xba\xd8\xa7\xd8\xaa.'
3
但是我认为这是个小问题。
正如我前面提到的,主要问题是输出文本文件的文本完全断开。
在记事本中,它看起来像这样: https://i.stack.imgur.com/Fhmqh.png
在NotePad ++中,它看起来像这样: https://i.stack.imgur.com/gcA6z.png
我正在使用Python 3.4。这只是我第二次尝试使用Python。因此,我可能需要一些其他细节。
答案 0 :(得分:0)
我不认为nltk首先支持阿拉伯语,因此sent_tokenize
无法正常工作。如果您查看source code,则可以看到如果未指定语言,则默认为英语。
您的代码示例没有正确的缩进。
下一个函数名称应以小写字母开头,只有类应具有大写字母名称。参见PEP 8 -- Style Guide for Python Code
您的print(sent.encode('utf-8'))
是导致控制台输出的原因。您所看到的是任何字符串sent_tokenize
认为是句子的字节版本。请参阅str.encode()
的文档。如果您希望它看起来“正常”,只需print(sent)
。
最后,我看不出要写入csv的理由,如果您要将文本输出到文件中,则只需执行
with open('Output_AR.txt', 'w', encoding='utf-8') as f:
for sent in sent_tokenize(sentences):
f.write(sent)
或者仅一次将所有行写入文件,如下所示:
with open('Output_AR.txt', 'w', encoding='utf-8') as f:
f.writelines(sent_tokenize(sentences))
我不太了解您要使用NewCount
做什么(应该重命名为小写),但是您可以
with open('Output_AR.txt', 'w', encoding='utf-8') as f:
for i, sent in enumerate(sent_tokenize(sentences)):
f.write(f"{i} {sent}")
如果要包括句子编号(看起来像吗?)。
尽管nltk不支持该语言,但您极有可能无法正确执行操作。请查看此内容是否对您有帮助:Python Arabic NLP