我写了一个在文本中找到同形异义词的函数。
同形异义词是一个与另一个同一书面形式的词 但是有不同的含义。
为此,我使用了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
。请告诉我如何简化它并加快速度。
答案 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)