NLP获取单词的最常见POS标签,并将其与培训数据一起在字典中使用

时间:2018-10-15 00:16:05

标签: python nlp pos-tagger

我有一个训练文本文件,格式如下(pos,word,tag):

1我PRP

2'd MD

3个像VB

4到TO

5转到VB

6。 。

1我PRP

我正在尝试构建字典,以便当我输入具有以下格式(位置,单词)的新语料库时:

1个人

2知道

3什么

4将

5次发生

6。

我将能够从我用训练数据构建的词典中为这些标记。

我使用的方法是默认字典中的计数器,以查找单词的最常见标签。从我的柜台,我得到这样的打印结果:

i PRP 7905

MD 1262

像VB 2706

像VBP 201

像UH 95

像IN 112

至TO 4822

到IN 922

对于“ like”一词,计数最高的标签是2706的“ VB”。我想在我的字典中使用计数最高的标签并将其附加到我的单词上,以便进行测试仅带有(pos,word)的数据集,它将返回该标签。到目前为止,这是我的代码:

file=open("/Users/Desktop/training.txt").read().split('\n')

from collections import Counter, defaultdict
word_tag_counts = defaultdict(Counter)
for row in file:         
    if not row.strip():
        continue          
    pos, word, tag = row.split()
    word_tag_counts[word.lower()][tag] += 1

stats = word_tag_counts
max(stats, key=stats.get)

with open('/Users/Desktop/training.txt','r') as file:
    for line in file.readlines():
        column = line.split('\t') 
with open('/Users/Desktop/output.txt','w') as file: 
    for tag, num in d.items(): 
        file.write("\t".join([column[0], column[1], tag])+"\n")

我收到错误消息:“ Counter”和“ Counter”的实例之间不支持TypeError:“>”

我的输出目标与原始训练文件的格式相同(pos从原始txt文件中提取,单词从原始txt文件中提取,我的词典中的标签):

不知道我能做什么,我也尝试使用lambda,但是它不起作用。一切都会有所帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您现在想实现的是dict,将每个单词的小写形式映射到其最常用的POS标签。在stats中,每个单词的每个POS标签已经出现在训练数据中并存储在Counter中的次数。

您在max(stats, key=stats.get)行做错了。 stats.get(word)返回与单词Counter相关的word,并且Counter在Python 3中不具有可比性(但是在Python 2中是可比较的,但实际上并没有合理)。更重要的是,即使Counter是可比较的,max函数也只会返回最大Counter的单词,这不是您想要的。

我们需要做的是使用most_common() s的Counter方法。对于每个单词word,将get()的{​​{1}}(命名为Counter)并调用c以获取其最频繁的POS标签。我们需要下标c.most_common(1)[0][0]的原因是,[0][0]返回了前-most_common(k)个频繁项的列表,并且对于每个此类项,它返回一个包含项本身及其频率的元组。因此代码如下所示:

k

pos_tags = {word: stats[word].most_common(1)[0][0] for word in stats} 是您想要的映射。您所需要做的就是完成其余代码(将POS标记方法应用于其他文件)。