我有一个文本和一个我想确定每个单词最常见的大小写并用它创建一个字典。这是文本的摘录:
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”或“pencil”。我想创建一个函数,首先确定哪些选项是最常见的。我首先根据大小写将所有单词分为三组,但我不知道如何确定哪种情况最常见(我想我必须对三个列表进行比较,但我不知道该怎么做):
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"...}
请您参考如下方法:
我假设 text 已经是单词的可迭代对象,并且不会出现像 'pEnCiL' 这样的单词。
您可以立即开始构建包含计数的字典,而不是构建这三个列表。我建议使用 defaultdict,它会在缺少 key 时返回 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有一个正则表达式可以帮助您从字符串中提取单词。
