2016-01-11 15 views
0

我寫了在文本中查找同形異義詞的函數。如何簡化查找同形異義詞的功能?

同形異義詞是一個單詞,與另一個 單詞共享相同的書面形式,但具有不同的含義。

爲此,我使用了NLTK的POS-Tagger(pos_tag)。

POS-tagger處理單詞序列,並將 語音標記的一部分附加到每個單詞。

例如: [( '和', 'CC'),( '現在', 'RB'),( '對', 'IN'),( '東西', 'NN' ), ('完全','RB'),('不同','JJ')]。

碼(編輯):

def find_homographs(text): 
    homographs_dict = {} 
    if isinstance(text, str): 
     text = word_tokenize(text) 
    tagged_tokens = pos_tag(text) 
    for tag1 in tagged_tokens: 
     for tag2 in tagged_tokens: 
      try: 
       if dict1[tag2] == tag1: 
        continue 
      except KeyError: 
       if tag1[0] == tag2[0] and tag1[1] != tag2[1]: 
        dict1[tag1] = tag2 
    return homographs_dict 

它的工作原理,但是需要太多的時間,因爲我用兩個週期for。請給我建議我怎樣才能簡化它並且讓速度更快。

回答

4

這似乎違反直覺,但你可以很容易地收集全部您的文本中每個單詞的POS標籤,然後只保留具有多個標籤的單詞。

from collections import defaultdict 
alltags = defaultdict(set) 
for word, tag in tagged_tokens: 
    alltags[word].add(tag) 
homographs = dict((w, tags) for w, tags in alltags.items() if len(tags) > 1) 

注意雙變量循環;這比編寫tag1[0]tag1[1]更方便。 defaultdict(和set)你必須查閱手冊。

您的輸出格式不能處理帶有三個或更多POS標籤的單詞,因此詞典homographs具有單詞作爲鍵和POS標籤集作爲值。

另外還有兩件事我建議:(1)將所有單詞轉換爲小寫,以便捕捉更多「同形異義詞」;和(2)nltk.pos_tag()預計一次只能用一個句子呼叫,所以如果您的文字分別爲sent_tokenize()word_tokenize()pos_tag(),您將得到更正確的標記。

+0

Alexis,它的工作原理錯誤。 – GiveItAwayNow

+1

錯誤如何?你將不得不更具體。我在發佈之前測試了我的代碼,並且它可以正常工作。你的輸出格式不能處理帶有三個或更多POS標籤的單詞,所以我的詞典有單詞作爲鍵和POS標籤集作爲值。 – alexis

+0

亞歷克西斯,這是我的壞,我很抱歉。你的代碼完美地工作。感謝您的建議。 – GiveItAwayNow

0

這裏有一個建議(未測試),但主要的想法是建立一個字典解析tagged_tokens時,在非嵌套循環,以確定形異義詞:

temp_dict = dict() 
for tag in tagged_tokens: 
    temp_dict[tag[0]] = temp_dict.get(tag[0],list()).append(tag[1]) 
for temp in temp_dict.items(): 
    if len(temp[1]) == 1: 
     del temp_dict[temp [0]] 
print (temp_dict) 
+0

Laurent H.,無法理解這個 'temp_dict.get(tag [0],list())。append(tag [1])' – GiveItAwayNow

+0

你有沒有想過會發生什麼,如果_noun_'cat'發生三次? – alexis

+0

謝謝你,亞歷克西斯。你是對的,我沒有想過這個。我修好了。 – GiveItAwayNow