代码之家  ›  专栏  ›  技术社区  ›  Balaji

从元素列表中提取文本计数

  •  1
  • Balaji  · 技术社区  · 6 年前

    我有一个包含文本元素的列表。

    text = ['a for=apple','b for=ball', 'd for=dog', 'e for=elephant', 'a for=apple', 'd for=dog', '1.=one', '2.=two'] 
    

    我需要获得“=”之前存在的文本计数。我将CountVectorizer如下所示用于标记模式,但它没有给出预期的结果

    print(text)
    vectorizer = CountVectorizer()
    vectorizer = CountVectorizer(token_pattern="^[^=]+")
    vectorizer.fit(text)
    print(vectorizer.vocabulary_)
    

    其输出如下

    {'a for': 2, 'b for': 3, 'd for': 4, 'e for': 5, '1.': 0, '2.': 1}
    

    但预期输出应为

    {'a for': 2, 'b for': 1, 'd for': 2, 'e for': 1, '1.': 1, '2.': 1}
    

    我还需要删除“”来自“1”所以我的输出是

     {'a for': 2, 'b for': 1, 'd for': 2, 'e for': 1, '1': 1, '2': 1}
    

    我有什么办法可以做到吗?

    4 回复  |  直到 6 年前
        1
  •  0
  •   RoadRunner    6 年前

    一个简单的方法是使用 collections.Counter() :

    >>> from collections import Counter
    >>> text = ['a for=apple','b for=ball', 'd for=dog', 'e for=elephant', 'a for=apple', 'd for=dog', '1.=one', '2.=two']
    >>> Counter(x.split('=')[0].replace('.', '') for x in text)
    Counter({'a for': 2, 'd for': 2, 'b for': 1, 'e for': 1, '1': 1, '2': 1})
    

    它首先将文本中的每个字符串拆分为 "=" 并从中获取第一个元素。然后 replace() 调用以替换 "." 具有 "" . 最后,它返回 Counter() 计数的对象。

    注: 如果要在末尾返回纯词典,可以将 dict() 到最后一行。

        2
  •  0
  •   Veera Balla Deva    6 年前
    import re
    dictionary = {}
    
    def remove_special_characters(value):
        if '.' in value:
            return re.sub(r'\.=\w+','',value)
        return value.split('=')[0]
    for value in text:
        new_value = remove_special_characters(value)
        if new_value in dictionary:
            dictionary[new_value] += 1
        else:
            dictionary[new_value] = 1
    print(dictionary)
    >>>{'a for': 2, 'b for': 1, 'd for': 2, 'e for': 1, '1': 1, '2': 1}
    
        3
  •  0
  •   me.ydv.5    6 年前
    from collections import Counter
    
    text = ['a for=apple','b for=ball', 'd for=dog', 'e for=elephant', 'a for=apple', 'd for=dog', '1.=one', '2.=two']
    
    text = [i.split('=')[0] for i in text]      #consider only the first part of the split
    text = [i.split('.')[0] for i in text]
    frequency = {}
    for each in text:
        if each in frequency:
            frequency[each] += 1
        else:
            frequency[each] = 1
    print(frequency)                        #if you want to use dict
    
    counts =list(Counter(text).items())     #if you want to use collections module
    print(counts)
    

    请注意,这只适用于 text 列表显示,即,仅包含一个 = ,除此之外,你需要稍微调整一下。

        4
  •  0
  •   zdgriffith    6 年前

    您可以在没有CountVectorizer的情况下执行此操作:

    text = ['a for=apple','b for=ball', 'd for=dog', 'e for=elephant', 'a for=apple', 'd for=dog', '1.=one', '2.=two'] 
    left_sides = [pair.split('=')[0].replace('.','') for pair in text]
    uniques = set(left_sides)
    counts = {i:left_sides.count(i) for i in uniques}
    print(counts)
    

    这将产生:

    {'d for': 2, 'b for': 1, '1': 1, 'a for': 2, '2': 1, 'e for': 1}