我有一个训练文本文件,格式如下(pos,word,tag):
1个I PRP
2 'd MD
3如VB
4到4到
5 go VB
6.。
1个I PRP
我正在尝试建立一个字典,以便当我输入以下格式(pos,word)的新语料库时:
1谁
2个人知道
3什么
4会
5发生
6.
我将能够从我用训练数据构建的字典中对它们进行标记。
我使用的方法是默认字典中的一个计数器,用于查找单词的最常见标记。从我的计数器中,我得到了如下打印结果:
I PRP 7905
1262
如VB 2706
如VBP 201
如UH 95
如IN 112
转至4822
至IN 922
因此,对于单词"like",计数最高的标签是“VB”,为2706。我想让我的字典获取具有最高计数的标签,并将其附加到我的单词中,以便如果我将测试数据集仅包含(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文件中提取,word从原始txt文件中提取,标签从我的字典中提取):
不确定我能做什么,我也试着使用lambda,但它不起作用。任何事都会有帮助。谢谢。
发布于 2018-10-15 09:27:12
如果我理解正确的话,您现在想要实现的是让一个dict
将每个单词的小写形式映射到其最频繁的POS。在stats
中,您可以知道每个单词的每个词性标签在存储在Counter
中的训练数据中出现的次数。
max(stats, key=stats.get)
这一行是你做错了的地方。stats.get(word)
返回与word word
相关的Counter
,而Counter
s在Python3中是不可比较的(然而,它们在Python2中是可比较的,但这并不真正有意义)。更重要的是,即使Counter
是可比较的,max
函数也只返回具有最大Counter
的单词,这并不是您想要的结果。
我们需要做的是使用POS的most_common()
方法,对于每个单词word
,get()
它的Counter
(让我们把它命名为c
),并调用c.most_common(1)[0][0]
来获得它最频繁的POS。我们需要下标[0][0]
的原因是,most_common(k)
返回一个top-k
频繁项的列表,并且对于每个这样的项,它返回一个包含该项本身及其频率的元组。因此,代码将如下所示:
pos_tags = {word: stats[word].most_common(1)[0][0] for word in stats}
而pos_tags
就是您想要的映射。您所需要做的就是完成代码的其余部分(将此POS标记方法应用于其他文件)。
https://stackoverflow.com/questions/52808220
复制相似问题