如何在Python中将阿拉伯语文本拆分或标记为句子

2 投票
2 回答
4476 浏览
提问于 2025-04-18 07:48

我有个问题,我需要把阿拉伯语的文本分成句子,每个句子都是以句号(.)结尾的。然后再把句子分成单词。最后的输出结果就像下面这样。请问我该怎么做才能解决这个问题。

text = """ طوقت الشرطة المكان، عقب انتهاء الوقت المحدد لهم بالمغادرة. وكان المهاجرون يسعون إلى   الوصول إلى بريطانيا، ويقولون إنه ليس أمامهم مكان آخر ليذهبوا إليه، بعد تدمير المخيمات. وكانت عدة حافلات تقل عشرات من أفراد الشرطة قد وصلت صباح الأربعاء إلى المخيمات. وتشارك الشرطة الآن في المواجهة مع النشطاء هناك، بحسب ما ذكره مراسل بي بي سي، بول آدمز، الموجود في المكان."""
posttext = text.decode('utf-8')
sentences = nltk.tokenize.wordpunct_tokenize(posttext)
print sentences


the output is :
[u'\u0637\u0648\u0642\u062a', u'\u0627\u0644\u0634\u0631\u0637\u0629', u'\u0627\u0644\u0645\u0643\u0627\u0646', u'\u060c', u'\u0639\u0642\u0628', u'\u0627\u0646\u062a\u0647\u0627\u0621', u'\u0627\u0644\u0648\u0642\u062a', u'\u0627\u0644\u0645\u062d\u062f\u062f', u'\u0644\u0647\u0645', u'\u0628\u0627\u0644\u0645\u063a\u0627\u062f\u0631\u0629', u'.', u'\u0648\u0643\u0627\u0646', u'\u0627\u0644\u0645\u0647\u0627\u062c\u0631\u0648\u0646', u'\u064a\u0633\u0639\u0648\u0646', u'\u0625\u0644\u0649', u'\u0627\u0644\u0648\u0635\u0648\u0644', u'\u0625\u0644\u0649', u'\u0628\u0631\u064a\u0637\u0627\u0646\u064a\u0627', u'\u060c', u'\u0648\u064a\u0642\u0648\u0644\u0648\u0646', u'\u0625\u0646\u0647', u'\u0644\u064a\u0633', u'\u0623\u0645\u0627\u0645\u0647\u0645', u'\u0645\u0643\u0627\u0646', u'\u0622\u062e\u0631', u'\u0644\u064a\u0630\u0647\u0628\u0648\u0627', u'\u0625\u0644\u064a\u0647', u'\u060c', u'\u0628\u0639\u062f', u'\u062a\u062f\u0645\u064a\u0631', u'\u0627\u0644\u0645\u062e\u064a\u0645\u0627\u062a', u'.', u'\u0648\u0643\u0627\u0646\u062a', u'\u0639\u062f\u0629', u'\u062d\u0627\u0641\u0644\u0627\u062a', u'\u062a\u0642\u0644', u'\u0639\u0634\u0631\u0627\u062a', u'\u0645\u0646', u'\u0623\u0641\u0631\u0627\u062f', u'\u0627\u0644\u0634\u0631\u0637\u0629', u'\u0642\u062f', u'\u0648\u0635\u0644\u062a', u'\u0635\u0628\u0627\u062d', u'\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621', u'\u0625\u0644\u0649', u'\u0627\u0644\u0645\u062e\u064a\u0645\u0627\u062a', u'.', u'\u0648\u062a\u0634\u0627\u0631\u0643', u'\u0627\u0644\u0634\u0631\u0637\u0629', u'\u0627\u0644\u0622\u0646', u'\u0641\u064a', u'\u0627\u0644\u0645\u0648\u0627\u062c\u0647\u0629', u'\u0645\u0639', u'\u0627\u0644\u0646\u0634\u0637\u0627\u0621', u'\u0647\u0646\u0627\u0643', u'\u060c', u'\u0628\u062d\u0633\u0628', u'\u0645\u0627', u'\u0630\u0643\u0631\u0647', u'\u0645\u0631\u0627\u0633\u0644', u'\u0628\u064a', u'\u0628\u064a', u'\u0633\u064a', u'\u060c', u'\u0628\u0648\u0644', u'\u0622\u062f\u0645\u0632', u'\u060c', u'\u0627\u0644\u0645\u0648\u062c\u0648\u062f', u'\u0641\u064a', u'\u0627\u0644\u0645\u0643\u0627\u0646', u'.']

2 个回答

3

我建议使用 nltk.sent_tokenize(text),用法如下:

>>> text = """ طوقت الشرطة المكان، عقب انتهاء الوقت المحدد لهم بالمغادرة. وكان المهاجرون يسعون إلى   الوصول إلى بريطانيا، ويقولون إنه ليس أمامهم مكان آخر ليذهبوا إليه، بعد تدمير المخيمات. وكانت عدة حافلات تقل عشرات من أفراد الشرطة قد وصلت صباح الأربعاء إلى المخيمات. وتشارك الشرطة الآن في المواجهة مع النشطاء هناك، بحسب ما ذكره مراسل بي بي سي، بول آدمز، الموجود في المكان."""
>>> text = re.sub("؟", "?", text) # replace any ؟ with ?
>>> for sen in nltk.sent_tokenize(text):
...     print(sen)
 طوقت الشرطة المكان، عقب انتهاء الوقت المحدد لهم بالمغادرة.
وكان المهاجرون يسعون إلى   الوصول إلى بريطانيا، ويقولون إنه ليس أمامهم مكان آخر ليذهبوا إليه، بعد تدمير المخيمات.
وكانت عدة حافلات تقل عشرات من أفراد الشرطة قد وصلت صباح الأربعاء إلى المخيمات.
وتشارك الشرطة الآن في المواجهة مع النشطاء هناك، بحسب ما ذكره مراسل بي بي سي، بول آدمز، الموجود في المكان.

我们把 "؟" 替换成 "?",因为 nltk.sent_tokenize() 只适用于英语。

附注

句子分割和你描述的有点不同。比如,假设有这样一句话:

ا.د. مجدي يعقوب من أعظم الأطباء الجراحين بالعالم

如果按照你建议的方式(根据 . 来分割文本),那么缩写 "ا.د" 会被分开,这可能会导致意想不到的结果。而且,分割句子的标点符号不仅仅是 .,还有 ! 和 ?。

0

为什么不直接这样做呢:

text = " وقت الشرطة المكان، عقب انتهاء الوقت المحدد لهم بالمغادرة. وكان المهاجرون يسعون لى   الوصول إلى بريطانيا، ويقولون إنه ليس أمامهم مكان آخر ليذهبوا إليه، بعد تدمير المخيمات. وكانت عدة حافلات تقل عشرات من أفراد الشرطة قد وصلت صباح الأربعاء إلى المخيمات. وتشارك الشرطة الآن في المواجهة مع النشطاء هناك، بحسب ما ذكره مراسل بي بي سي، بول آدمز، الموجود في المكان."
posttext = text.decode('utf-8')

sentences = text.split(".")
for sentence in sentences:
    print sentence

撰写回答