2015-07-10 36 views
1

其實我打算爲波斯人做一個HMM POS tagger。我正在研究如下的語料庫。左邊的第一列包括波斯語單詞和右側第二列的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

什麼是您的文件格式? – Kasramvd

+0

@Kasra .txt文件 – marysd

回答

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')] 

請注意,在這裏,因爲你必須在你句末點,並有你的最後一個字,我用re.findall的dot.So之間沒有空格則無法使用str.split()方法查找所有單詞(長度爲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] 

所以之後,yo'll有內您的波斯的句子在persian_sent之內的第一個嵌套列表索引,以及第二個索引中的標記。

您可以通過執行獲得你的句子:

for i in persian_sent: 
    print ''.join(list(i)[0]) 

還要注意,由於zip在Python 3倍的回報,你需要將其轉換爲列表,當你想索引呢發電機!

+0

但首先我需要根據它們檢測句子和標記,然後必須添加句子開始標記,例如(「」,「」)。用字典我不認爲這是可能的。 – marysd

+0

@marysd請結帳編輯! – Kasramvd

+0

實際上你自己定義了這個句子,但是我怎樣才能定義它有一個單詞和標籤的字典。我申請了你在這裏做的任何事情,但出現了一個錯誤:Traceback(最近一次調用最後一次): 文件「」,第1行,在 tagged_sentence = [(i,tags [i])for i in re.findall (r'\ w + | \ S +',s)if i] NameError:name's'沒有被定義 – marysd

相關問題