我有一个训练文本文件,格式如下(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,但是它不起作用。一切都会有所帮助。谢谢。
答案 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标记方法应用于其他文件)。