【问题标题】:how can I read through such a corpus?我怎样才能阅读这样的语料库?
【发布时间】:2015-07-11 20:58:53
【问题描述】:

实际上我要为波斯语制作一个 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

【问题讨论】:

  • 你的文件格式是什么?

标签: python-3.x nltk


【解决方案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 方法或正则表达式,然后用您的 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()方法,因为你的句尾有一个点并且你的最后一个单词和点之间没有空格。所以我使用re.findall来查找所有单词(长度为 1 个或多个单词字符 (\w+) 且不含空格字符 (\S+) 的组合。

如果你想提取你的句子,你需要基于点或精确地使用以下正则表达式分割你的语料库,然后使用 mapzip

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 中的zip 返回一个生成器,因此您需要在要对其进行索引时将其转换为列表!

【讨论】:

  • 但首先我需要检测句子并根据它们进行标记,然后必须添加句子开头的标记,例如(“”,“”)。用字典我认为这是不可能的。
  • 实际上你自己定义了这个句子,但是我怎么能用一个单词和标签的字典来定义它。我应用了你在这里所做的任何事情,但出现了一个错误: Traceback (last recent call last): File "", line 1, in tagged_sentence=[(i,tags[i]) for i in re.findall(r'\w+|\S+',s) if i] NameError: name 's' is not defined
  • @marysd 您希望如何获取用于标记的文本?此错误表示您尚未定义名称s,因为那是我的变量名称;)。那么你是把你的句子放在一个变量中还是你想从一个文件中读取或者......?
  • 我想读句子的方式和你从字典里读的一样,但是你自己定义了句子。我没有将句子放在变量中。问题是,当我只有一个标签和单词字典时,我该怎么办? :-) 顺便感谢您的回复。 :-)
  • 我无法进入聊天室,因为我只有 19 个声望。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2019-12-16
  • 2015-04-06
  • 2021-08-09
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多