【问题标题】:Python :getting the count for the adjectives in a stringPython:获取字符串中形容词的计数
【发布时间】:2015-12-19 21:40:30
【问题描述】:

我有一个字符串 s= "Mr.X 太棒了。他太棒了。Y 先生也太棒了。"

我需要从字符串中提取所有形容词以及每个形容词的数量。例如 该字符串包含形容词“awesome”、“amazing”,其中 2 表示 Awesome,1 表示令人惊叹。

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

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

我需要代码来获取字符串中每个形容词的计数器。 它应该像 形容词:计数器

【问题讨论】:

  • 看看集合模块中的计数器。
  • 问题是我把所有的形容词都存储在一个列表中。我认为 Counter 不适用于列表
  • 查看pyMOTW
  • @DipitMalhotra 它适用于任何序列。

标签: python counter nltk


【解决方案1】:

你可以使用collections.Counter:

>>> from collections import Counter

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

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

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

或者您可以访问键和值:

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

编辑:

如需列表,需flatten the lists:

>>> 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:

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

【讨论】:

  • 感谢您的解决方案。但我还有另一个问题...我的列表形容词里面有多个列表。它基本上就像 adjectives= [['awesome,'amazing'], ['good', 'nice' ] 所以当我运行 Counter..它给出一个数组: TypeError: unhashable type: 'list'
  • @DipitMalhotra 添加列表解决方案列表
【解决方案2】:

您的问题的可能解决方案使用Counter。完整的解决方案是这样的

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。

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

我希望它有所帮助。我相信您可以将其放入您的代码中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多