Python : 获取字符串中形容词的个数
Python :getting the count for the adjectives in a string
我有一个字符串
s= "Mr.X is awesome. He is amazing.Mr.Y is awesome too."
我需要从字符串中提取所有形容词以及每个形容词的数量。例如
此字符串包含形容词 "awesome"、"amazing",其中 2 个表示 awesome,1 个表示 amazing。
为了提取形容词,我用过NLTK。这是提取形容词的代码,
adjectives =[token for token, pos in nltk.pos_tag(nltk.word_tokenize(b)) if pos.startswith('JJ')]
我需要代码来为字符串中的每个形容词获取一个计数器。
它应该像
形容词:计数器
您可以使用 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})
您的问题的可能解决方案是 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" 不同的键),但您可以随意拆分。
split交给了Counter方法,它创建了一个counter对象,它是一个dict。
然后我遍历键并删除所有那些不包含在我的形容词列表中的键。请注意,我的 for
遍历了 list(c)
,因为 del
会导致计数器改变大小,如果我直接使用它,我们会在 for
中出现错误(对象已更改尺寸)。
希望对您有所帮助。我相信您可以将它融入您的代码中。
我有一个字符串 s= "Mr.X is awesome. He is amazing.Mr.Y is awesome too."
我需要从字符串中提取所有形容词以及每个形容词的数量。例如 此字符串包含形容词 "awesome"、"amazing",其中 2 个表示 awesome,1 个表示 amazing。
为了提取形容词,我用过NLTK。这是提取形容词的代码,
adjectives =[token for token, pos in nltk.pos_tag(nltk.word_tokenize(b)) if pos.startswith('JJ')]
我需要代码来为字符串中的每个形容词获取一个计数器。 它应该像 形容词:计数器
您可以使用 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})
您的问题的可能解决方案是 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" 不同的键),但您可以随意拆分。
split交给了Counter方法,它创建了一个counter对象,它是一个dict。
然后我遍历键并删除所有那些不包含在我的形容词列表中的键。请注意,我的 for
遍历了 list(c)
,因为 del
会导致计数器改变大小,如果我直接使用它,我们会在 for
中出现错误(对象已更改尺寸)。
希望对您有所帮助。我相信您可以将它融入您的代码中。