我有一个文本,并且我想确定每个单词的最常用大写字母并使用它创建字典。这是文本的一部分:
PENCIL: A pencil is an object we use to write. Pencil should not be confused by pen, which is a different object. A pencil is usually made from a pigment core inside a protective casing.
例如,在我的文本中,诸如“铅笔”之类的单词可能显示为“铅笔”,“铅笔”或“铅笔”。我想创建一个函数,该函数首先确定哪个选项是最常用的。尽管我不知道如何确定哪种情况是最常见的(我想我必须对这三个列表进行比较,但我还是根据大小写将所有单词分为三类)。不知道该怎么做):
list_upper = []
list_lower = []
list_both = []
for word in text:
if isupper(word):
list_upper.append(word)
if islower(word):
list_lower.append(word)
if word == word.title():
list_both.append(word)
然后,它将创建一个字典,其中第一个键是小写单词,而值是最常见的类型。例如:pencil, Pencil
。我也不知道该怎么做...这是我想要的输出:
my_dictionary = {"pencil":"Pencil", "the":"THE"...}
答案 0 :(得分:3)
我假设text
已经可以单词迭代,并且不会出现'pEnCiL'
这样的单词。
代替构建这三个列表,您可以立即构建带有计数的字典。我建议使用defaultdict
,当缺少键时它返回Counter
实例。
from collections import defaultdict, Counter
cases = defaultdict(Counter)
for word in text:
cases[word.lower()][word] += 1
对于列表text
及其内容
['pencil', 'pencil', 'PENCIL', 'Pencil', 'Pencil', 'PENCIL', 'rubber', 'PENCIL']
这将产生以下cases
字典。
defaultdict(collections.Counter,
{'pencil': Counter({'PENCIL': 3, 'Pencil': 2, 'pencil': 2}),
'rubber': Counter({'rubber': 1})})
您可以从此处构建最终结果,如下所示。
result = {w:c.most_common(1)[0][0] for w, c in cases.items()}
这会给你
{'pencil': 'PENCIL', 'rubber': 'rubber'}
在此示例中为。如果经常出现两种情况,则以任意一种为最常见。
〜编辑〜
结果证明text
不是单词的重复单词。 Daniel Mesejo's answer有一个正则表达式,可以帮助您从字符串中提取单词。
答案 1 :(得分:2)
您可以将Counter与defaultdict一起使用:
import re
from collections import Counter, defaultdict
def words(t):
return re.findall('\w+', t)
text = """PENCIL: A pencil is an object we use to write.
Pencil should not be confused by pen, which is a different object.
A pencil is usually made from a pigment core inside a protective casing.
Another casing with different Casing"""
table = defaultdict(list)
for word in words(text):
table[word.lower()].append(word)
result = {key: Counter(values).most_common(1)[0][0] for key, values in table.items()}
print(result)
输出
{'casing': 'casing', 'be': 'be', 'core': 'core', 'another': 'Another', 'object': 'object', 'should': 'should', 'from': 'from', 'write': 'write', 'pen': 'pen', 'protective': 'protective', 'a': 'a', 'which': 'which', 'pencil': 'pencil', 'different': 'different', 'not': 'not', 'is': 'is', 'by': 'by', 'inside': 'inside', 'to': 'to', 'confused': 'confused', 'with': 'with', 'pigment': 'pigment', 'we': 'we', 'use': 'use', 'an': 'an', 'made': 'made', 'usually': 'usually'}
首先创建一个字典,其中的键是每个单词的小写变体,而值是相应出现的列表。然后使用Counter来计数每个机壳的数量并得到最常用的机壳。请注意使用正则表达式提取单词。
答案 2 :(得分:1)
您已经有了两个不错的答案。只是为了好玩,我认为我们可以尝试使用内置函数,因为您已经标记了以下单词:
# Create a temp dict within the main dict that counts the occurrences of cases
d= {}
for word in words:
d.setdefault(word.lower(), {}).setdefault(word, 0)
d[word.lower()][word] += 1
# Create a function to convert the temp d back to its most common occurrence
def func(dct):
return sorted(dct.items(), key=lambda x: x[-1])[-1][0]
# Use function and dictionary comprehension to convert the results.
result = {k: func(v) for k, v in d.items()}
测试用例:
text = """
PENCIL: A pencil is an object we use to write.
Pencil should not be confused by pen, which is a different object.
A pencil is usually made from a pigment core inside a protective casing.
PENCIL PENCIL PENCIL Pigment Pigment Pigment Pigment
"""
# Added last line to produce a different result
result
# {'pencil': 'PENCIL',
# 'a': 'a', 'is': 'is',
# 'an': 'an', 'object': 'object',
# 'we': 'we', 'use': 'use', 'to': 'to',
# 'write': 'write', 'should': 'should',
# 'not': 'not', 'be': 'be', 'confused':
# 'confused', 'by': 'by', 'pen': 'pen',
# 'which': 'which', 'different': 'different',
# 'usually': 'usually', 'made': 'made',
# 'from': 'from', 'pigment': 'Pigment',
# 'core': 'core', 'inside': 'inside',
# 'protective': 'protective', 'casing': 'casing'}