实际上,我要为波斯语制作一个HMM POS标记器。我正在研究如下语料库。左边的第一列包含波斯语单词,右边的第二列包含POS标签。 我的问题是,我如何阅读它,根据句子对其进行标记,然后将标签和单词保存在列表中,如下面的代码那样?
words = [nltk.word_tokenize(s) for s in sentences]
tagged = [nltk.pos_tag(w) for w in words]
任何可以帮助我的建议或代码?
# DELM
اولين ADJ_SUP
سياره N_SING
خارج ADJ_SIM
از P
منظومه N_SING
شمسي ADJ_SIM
ديده ADJ_INO
شد V_PA
. DELM
# DELM
# DELM
واشنگتن N_SING
ـ DELM
خبرگزاري N_SING
جمهوري N_SING
اسلامي ADJ_SIM
# DELM
ستاره شناسان N_PL
مي گويند V_PRS
كه CON
ممكن ADJ_SIM
است V_PRE
اولين ADJ_SUP
سياره N_SING
خارج ADJ_SIM
از P
منظومه N_SING
شمسي ADJ_SIM
را P
ديده ADJ_INO
باشند V_SUB
. DELM
答案 0 :(得分:1)
你可以简单地用空格分割你的单词字典,但请注意,由于你的单词之间有空格,你可以使用re
模块基于3个或更多空格进行分割:
import re
with open('out.txt') as f:
tags=dict(map(lambda x:re.split(r' {3,}',x.strip()),f))
然后你可以通过索引获得正确的标签:
print (tags['منظومه'])
'N_SING'
然后在您的主要文字中,当您想要标记您的单词时,您可以根据需要拆分文本,您可以使用简单的字符串split
方法或正则表达式,然后将该单词替换为{{{{{{ 1}}字典。
示例:
tags
请注意,在这里你不能使用s='اولين سياره خارج از منظومه شمسي ديده شد.'
tagged_sentence=[(i,tags[i]) for i in re.findall(r'\w+|\S+',s) if i]
print (tagged_sentence)
[('اولين', 'ADJ_SUP'), ('سياره', 'N_SING'), ('خارج', 'ADJ_SIM'), ('از', 'P'), ('منظومه', 'N_SING'), ('شمسي', 'ADJ_SIM'), ('ديده', 'ADJ_INO'), ('شد', 'V_PA'), ('.', 'DELM')]
方法,因为你的句子末尾有一个点,你的最后一个单词和点之间没有空格。所以我用str.split()
查找所有单词(长度为1或更多单词字符的组合(re.findall
))和无空白字符(\w+
)。
如果要提取句子,则需要根据点拆分语料库或使用以下正则表达式精确分割,然后使用\S+
和map
:
zip
因此,在import re
with open('out.txt') as f:
all_sentences=re.findall(r'([^.]*\.[^\n]*)',f.read())
persian_sent=[zip(*map(lambda x:re.split(r' {3,}',x.strip()),i.split('\n'))) for i in all_sentences if i]
内嵌套列表的第一个索引和第二个索引中的标记之后,你的波斯语句子就会出现。
你可以这样做:
persian_sent
另请注意,因为python 3中的for i in persian_sent:
print ''.join(list(i)[0])
返回一个生成器,所以当你想索引它时需要将它转换为list!