确定Python中单词的最常见大小写

时间:2018-11-01 13:37:08

标签: python

我有一个文本,并且我想确定每个单词的最常用大写字母并使用它创建字典。这是文本的一部分:

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"...}

3 个答案:

答案 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'}