我一直在尝试编写用于拆分句子的代码。它在英语和其他从左到右的拉丁字母语言中效果很好。当我尝试用阿拉伯语做同样的事情时,文本出现完全断开连接,就像每个字母单独一样。我不确定问题是什么。
我的输入文本:
当世界想要交谈时,它会说 Unicode。立即注册参加将于 3 月在德国美因茨举行的第 10 届国际 Unicode 会议。会议将汇集来自互联网和 Unicode 行业各个领域的专家,在国际和地方层面,在现有系统中以及在计算机应用程序、字体、文本设计和多语言计算方面使用 Unicode 的方法将进行讨论。
我的代码:
# -*- 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。所以,我可能需要一些额外的细节。
我认为 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句