我一直在试着写一个句子分裂的代码。它在英语和其他从左到右的拉丁字母语言中非常有效。当我试着用阿拉伯语做同样的事情时,文本就完全断开了,就像每个字母一样。我不知道问题出在哪里。
我的输入文本:
عندمايريدالعالمأنيتكلّم،فهويتحدّثبلغةيونيكود。سجّلالآنلحضورالمؤتمرالدوليالعاشرليونيكود،الذيسيعقدفيآذاربمدينةمَايِنْتْس،ألمانيا。وسيجمعالمؤتمربينخبراءمنكافةقطاعاتالصناعةعلىالشبكةالعالميةانترنيتويونيكود،حيثستتم،علىالصعيدينالدوليوالمحليعلىحدسواءمناقشةسبلاستخداميونكودفيالنظمالقائمةوفيمايخصالتطبيقاتالحاسوبية،الخطوط،تصميمالنصوصوالحوسبةمتعددةاللغات。
我的代码:
# -*- 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
我正在使用Python3.4。这只是我对Python的第二次尝试。所以,我可能需要一些额外的细节。
发布于 2018-10-11 08:14:48
我不认为nltk首先支持阿拉伯语,所以sent_tokenize不能正常工作。如果您查看源代码,您可以看到它默认为英语,如果没有指定语言。
您的代码示例没有正确的缩进。
下一个函数名应该以小写开头,只有类应该有大写名称。请参阅PEP 8 -- Python代码样式指南
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阿拉伯语NLP
https://stackoverflow.com/questions/52754612
复制相似问题