1

给定一些 Penn Treebank 以这种格式标记的文本:

“大卫/NNP Short/NNP 会/MD 主席/VB/DT 会/NN./。/DT 男孩/NN 坐/VBZ 上/IN/DT 主席/NN./。”

我想生成一个以单词为键的多级字典,并计算它出现的频率被标记为每个 POS 所以我们有 ['Chair, VB : 1, NN : 1', 'The, DT : 3' ,] ETC。

我想我可以使用正则表达式来提取单词和相应的词性。

r'[A+Za+z]+/' and r'/[A+Z]+'

但是无法弄清楚如何将它们组合在一起来为单词及其相应的 POS 出现输入条目。

想法?

4

1 回答 1

2

在这种情况下,您不必使用正则表达式。

您可以做的是按空格拆分,然后通过斜线将结果收集到defaultdictofdefaultdictint

In [1]: import re

In [2]: from collections import defaultdict

In [3]: s = "David/NNP Short/NNP will/MD chair/VB the/DT meeting/NN ./. The/DT boy/NN sits/VBZ on/IN the/DT chair/NN
   ...:  ./."

In [4]: d = defaultdict(lambda: defaultdict(int))

In [5]: for item in s.split():
   ...:     word, tag = item.split("/")
   ...:     word = word.lower()
   ...:     d[word][tag] += 1

现在d将是:

In [6]: for word, word_data in d.items():
    ...:     for tag, count in word_data.items():
    ...:         print(word, tag, count)
    ...:         
('boy', 'NN', 1)
('short', 'NNP', 1)
('on', 'IN', 1)
('david', 'NNP', 1)
('will', 'MD', 1)
('sits', 'VBZ', 1)
('chair', 'VB', 1)
('chair', 'NN', 1)
('.', '.', 2)
('meeting', 'NN', 1)
('the', 'DT', 3)
于 2016-10-18T16:22:11.610 回答