python 中 XML 文件的阿拉伯语词干提取?

Arabic Stemming on XML file in python?

我有一个阿拉伯语 XML 下面是一个小样本。我想阻止除 <en> 标签中的所有 XML,并且我希望更改原始 XML 文件中的文字。

<?xml version='1.0' encoding='UTF-8' ?>
<TEXT>
<PHRASE>
<PSEUDO-V>ان</PSEUDO-V>
<N>وزير</N>
<N>الخارجية</N>
<en x='PERS'>فرانك فالتر شتاينماير</en>
<V y='0'>سيتوجه</V>
<N>السبت</N>
<PREP>إلى</PREP>
<en x='LOC'>الشرق الأوسط</en>
</PHRASE>
<PHRASE>
<V>علم</V>
<N>الأهل</N>
<PREP>ب</PREP>
<N y='1'>مغادرت</N>
<en x='PERS'>البابا</en>
<PREP y='1'>إلى</PREP>
<en x='LOC'>المدينة مكة</en>
</PHRASE>
<PHRASE> 
</TEXT>

我尝试了以下方法,但由于某种原因它不起作用。 注意: <en> 标签中的 X 属性是:LOC-PERS-DATE-ORG

import re
import xml.etree.ElementTree as ET
from nltk.stem.isri import ISRIStemmer

tree2 = ET.parse('TrainBaseEnglishcopy.xml')
root2 = tree2.getroot()


for phrase in root2.findall('./PHRASE'):
    ens = {en.get('x'): en.text for en in phrase.findall('en')}
    if not ('ORG' in ens and 'PERS' in ens and 'LOC' in ens and 'DATE' in ens):
      phrase=st.stem(phrase)

我收到错误:

Traceback (most recent call last): 
File "20Dec.py", line 475, 
     in <module> phrase=st.stem(phrase) 
File /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/n‌​ltk/stem/isri.py", line 153, 
     in stem token = self.norm(token, 1) # remove diacritics which representing Arabic short vowels 
File /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/n‌​ltk/stem/isri.py", line 186, 
     in norm word = self.re_short_vowels.sub('', word) TypeError: expected string or bytes-like object –

注意:词干本身工作正常 例如

w = 'يعمل'
print (st.stem(w))

工作正常。

---更新-- 我必须这样工作,但我必须为每个标签重复,但它并没有改变原始 XML 文件中的文本,有什么想法吗?

for phrase in root2.findall('./PHRASE/N'):
    ens = {en.get('x'): en.text for en in phrase.findall('en')}
    if not ('ORG' in ens and 'PERS' in ens and 'LOC' in ens and 'DATE' in ens):
      phrase.text=st.stem(phrase.text)
      print(phrase.text)

要修改您的 XML 文件,您应该在末尾使用命令 tree.write 提交它:

tree2 = ET.parse('TrainBaseEnglishcopy.xml')
root2 = tree2.getroot()

# ...manipulate tree...

tree2.write("out.xml", encoding="UTF-8")