关于counter:Python:获取字符串中形容词的计数

Python :getting the count for the adjectives in a string

我有根绳子S="X先生太棒了。他很了不起,Y先生也很了不起。"

我需要从字符串中提取所有形容词以及每个形容词的计数。例如这个字符串有形容词"棒极了","棒极了",其中2个表示棒极了,1个表示棒极了。

为了提取形容词,我使用了nltk。这是提取形容词的代码,

1
adjectives =[token for token, pos in nltk.pos_tag(nltk.word_tokenize(b)) if pos.startswith('JJ')]

我需要代码为字符串中的每个形容词获取一个计数器。应该是这样的形容词:计数器


您可以使用collections.Counter

1
2
3
4
5
6
>>> from collections import Counter

>>> adjectives = ['awesome', 'amazing', 'awesome']
>>> counts = Counter(adjectives)
>>> counts.items()
[('awesome', 2), ('amazing', 1)]

如果您愿意,可以将其转换为字典:

1
2
>>> dict(counts.items())
{'amazing': 1, 'awesome': 2}

或者您可以访问键和值:

1
2
3
4
>>> for key in counts.keys():
...     print key, counts.get(key)
awesome 2
amazing 1

编辑:

对于列表列表,需要展开列表:

1
2
3
4
5
6
>>> adjectives = [['awesome', 'amazing'], ['good', 'nice' ]]
>>> counts = Counter(adjective
...                  for group in adjectives
...                  for adjective in group)
>>> counts
Counter({'awesome': 1, 'good': 1, 'amazing': 1, 'nice': 1})

或使用itertools.chain.from_iterable

1
2
3
>>> from itertools import chain
>>> Counter(chain.from_iterable(adjectives))
Counter({'awesome': 1, 'good': 1, 'amazing': 1, 'nice': 1})


您的问题可能的解决方案是使用计数器。完整的解决方案是

1
2
3
4
5
6
7
s="Mr.X is awesome He is amazing Mr.Y is awesome too."
adjectives=["awesome","beautiful","handsome","amazing"]
c=collections.Counter(s.split())
for key in list(c):
    if (key not in adjectives):
        del c[key]
print c

我用形容词创建了一个列表,因为我认为你的解决方案已经适合你了。

接下来,我使用空格分割句子,创建一个标记列表。注意,标点符号(例如,你的句子中有"awesome(棒极了)",这将映射到不同于"awesome(棒极了)"的键),但你可以随意拆分。

拆分被赋予counter方法,该方法创建一个counter对象,即dict。

然后我迭代键并删除所有那些不包含在形容词列表中的键。注意,我的for迭代list(c),因为del会导致计数器更改大小,如果我直接使用它,我们会在for中得到一个错误(对象更改大小)。

希望有帮助。我相信你可以把它应用到你的代码中。