2017-08-30 111 views
1

我使用nltk .tokenize(),.pos_tag()和wordnet .synsets()獲得以下輸出。輸出是用於文件和共發現自己的部分詞性標註每個令牌可能匹配的列表的列表(在這裏,我們有4個令牌,因此,比賽的4名名單):從列表中提取第n個元素

[[Synset('document.n.01'), 
 
    Synset('document.n.02'), 
 
    Synset('document.n.03'), 
 
    Synset('text_file.n.01'), 
 
    Synset('document.v.01'), 
 
    Synset('document.v.02')], 
 
[Synset('be.v.01'), 
 
    Synset('be.v.02'), 
 
    Synset('be.v.03'), 
 
    Synset('exist.v.01'), 
 
    Synset('be.v.05'), 
 
    Synset('equal.v.01'), 
 
    Synset('constitute.v.01'), 
 
    Synset('be.v.08'), 
 
    Synset('embody.v.02'), 
 
    Synset('be.v.10'), 
 
    Synset('be.v.11'), 
 
    Synset('be.v.12'), 
 
    Synset('cost.v.01')], 
 
[Synset('angstrom.n.01'), 
 
    Synset('vitamin_a.n.01'), 
 
    Synset('deoxyadenosine_monophosphate.n.01'), 
 
    Synset('adenine.n.01'), 
 
    Synset('ampere.n.02'), 
 
    Synset('a.n.06'), 
 
    Synset('a.n.07')], 
 
[Synset('trial.n.02'), 
 
    Synset('test.n.02'), 
 
    Synset('examination.n.02'), 
 
    Synset('test.n.04'), 
 
    Synset('test.n.05'), 
 
    Synset('test.n.06'), 
 
    Synset('test.v.01'), 
 
    Synset('screen.v.01'), 
 
    Synset('quiz.v.01'), 
 
    Synset('test.v.04'), 
 
    Synset('test.v.05'), 
 
    Synset('test.v.06'), 
 
    Synset('test.v.07')]]

如果我想要寫的功能(一個循環,有可能),以只提取第一個匹配的每個令牌,並且產生的輸出作爲一個新的列表,例如(上面使用例子)以下:

[Synset('document.n.01'), Synset('be.v.01'), Synset('angstrom.n.01'), Synset('trial.n.02')] 

什麼是最靈活的方式w儀式這樣的功能?這樣它可以擴展到其他標記文檔(帶有pos標記)?

謝謝。

回答

1

所以我會解決一個例子來循環到這種類型的列表,你可以嘗試用你的一樣。

a=[[1,2,3],[4,5,6],[7,8,9]] 
    for x in a: 
     print(x[0]) 
    Output looks like: 
    1 
    4 
    7 
+0

我已經嘗試在我的輸出中使用list.append(),但它返回一個錯誤消息「列表索引超出限制」。但謝謝你回答。 –

+0

爲什麼要使用list.append(),你問的問題只是以上面所需的方式打印輸出的權利?那麼上面那個不符合你的要求?讓我知道如果你想做更多的事 –

+0

我使用list.append(),因爲我正在定義一個函數,將返回一個列表對象。可以肯定的是,打印也將成功。 –

3

使用列表理解。

[token[0] for token in data if token] 
+0

我可以把它列入清單嗎?我在我的代碼下運行你的代碼,但它返回一個錯誤消息'list index out of range' –

+0

@ChrisT .:如果'data'等於你的令牌列表,我不知道你爲什麼看到這個錯誤。 –

+0

我認爲這與原始文本中的'this'這樣的標記有關,因爲當使用wn.synsets()獲取此標記的syn引用時,它將返回[]。如果使用令牌[0]來表示[] [0],則會產生錯誤。無論如何修改函數以跳過「不匹配」標記? –