我怎样才能阅读这样的语料库?
how can I read through such a corpus?
实际上我要为波斯语制作一个 HMM 词性标注器。我正在处理如下的语料库。左边的第一列包含波斯语单词,右边的第二列是 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
您可以通过使用 space 拆分行来简单地创建您的单词字典,但请注意,由于您的单词之间有 space,您可以使用 re
模块来拆分基于 3 space 或更多 :
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
方法或正则表达式,然后用你的相应项目替换单词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()
方法,因为你的句末有一个点,而你的最后一个字和dot.So我之间没有space使用 re.findall
查找所有单词(长度为 1 或多个单词字符 (\w+
) 的组合)和 none 白色 space 字符 (\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
嵌套列表的第一个索引中有你的波斯语句子,在第二个索引中有标签。
你可以通过以下方式得到你的句子:
for i in persian_sent:
print ''.join(list(i)[0])
另请注意,由于 python 3 returns 中的 zip
生成器,您需要将其转换为列表才能对其进行索引!
实际上我要为波斯语制作一个 HMM 词性标注器。我正在处理如下的语料库。左边的第一列包含波斯语单词,右边的第二列是 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
您可以通过使用 space 拆分行来简单地创建您的单词字典,但请注意,由于您的单词之间有 space,您可以使用 re
模块来拆分基于 3 space 或更多 :
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
方法或正则表达式,然后用你的相应项目替换单词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()
方法,因为你的句末有一个点,而你的最后一个字和dot.So我之间没有space使用 re.findall
查找所有单词(长度为 1 或多个单词字符 (\w+
) 的组合)和 none 白色 space 字符 (\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
嵌套列表的第一个索引中有你的波斯语句子,在第二个索引中有标签。
你可以通过以下方式得到你的句子:
for i in persian_sent:
print ''.join(list(i)[0])
另请注意,由于 python 3 returns 中的 zip
生成器,您需要将其转换为列表才能对其进行索引!