如何简化发现同形异义词的功能?

时间:2016-01-11 20:15:15

标签: python-3.x nltk cycle

我写了一个在文本中找到同形异义词的函数。

  

同形异义词是一个与另一个同一书面形式的词   但是有不同的含义。

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

  

POS-tagger处理一系列单词,并附加一部分单词   每个单词的语音标记。

例如: [(' And',' CC'),(' now',' RB'),' for && #39;,' 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。请告诉我如何简化它并加快速度。

2 个答案:

答案 0 :(得分: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)将所有单词转换为小写以便更多地接收"同形异义词&#34 ;;并且(2)nltk.pos_tag()期望一次调用一个句子,因此如果sent_tokenize()您的文字word_tokenize()pos_tag(),您将获得更正确的标记每个句子分开。

答案 1 :(得分: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)