Python Collections.counter并从JSON中排除内容

时间:2018-10-24 14:11:25

标签: python python-3.x

我想创建Facebook上'my'和'my gf'之间的常用单词的可视化。我直接从FB将所有消息下载到JSON文件中,并且计数器正常工作

但是:

  • Counter还会计算JSON中的元素名称,例如“ sender_name”或13位数字的时间戳
  • JSON文件缺少 UTF编码-我有\u00c5\u0082a\u00c5\u0082a之类的字符串硬编码为单词< / li>

如何排除“ you, I, a, but”等无意义的简短单词?

对于第一个问题,我尝试创建要排除的单词词典,但是我不知道如何甚至排除它们。另外,问题在于删除时间戳记号,因为它们不是恒定的。

对于第二个问题,我尝试仅在单词编辑器中打开文件并替换符号代码,但是由于文件大小(超过150万行),每次都会崩溃。

这是我用来打印最常用单词的代码

import re
import collections
import json

file = open('message.json', encoding="utf8")
a = file.read()

words = re.findall(r'\w+', a)

most_common = collections.Counter(map(str.lower, words)).most_common(50)
print(most_common)

JSON文件结构如下:

{
      "sender_name": "xxxxxx",
      "timestamp_ms": 1540327935616,
      "content": "Podobaj\u00c4\u0085 ci si\u00c4\u0099",
      "type": "Generic"
    },

2 个答案:

答案 0 :(得分:2)

问题是您在整个文件中使用findall,请执行以下操作:

import re
import collections
import json


def words(s):
    return re.findall('\w+', s, re.UNICODE | re.IGNORECASE)

file = open('message.json', encoding="utf8")
data = json.load(file)

counts = collections.Counter((w.lower() for e in data for w in words(e.get('content', ''))))
most_common = counts.most_common(50)
print(most_common)

输出

[('siä', 1), ('ci', 1), ('podobajä', 1)]

输出是针对具有以下内容(JSON对象列表)的文件的:

[{
      "sender_name": "xxxxxx",
      "timestamp_ms": 1540327935616,
      "content": "Podobaj\u00c4\u0085 ci si\u00c4\u0099",
      "type": "Generic"
}]

说明

使用json.load将文件内容作为字典data的列表加载,然后遍历字典的元素并使用功能{计算'content'字段的单词{1}}和words

进一步

  1. 要删除I,a和and之类的词,但请参见this

更新

鉴于文件的格式,您需要将以下内容更改为:Counterdata = json.load(file)

data = json.load(file)["messages"]

输出为:

{
  "participants":[],
  "messages": [
    {
      "sender_name": "xxxxxx",
      "timestamp_ms": 1540327935616,
      "content": "Podobaj\u00c4\u0085 ci si\u00c4\u0099",
      "type": "Generic"
    },
    {
      "sender_name": "aaa",
      "timestamp_ms": 1540329382942,
      "content": "aaa",
      "type": "Generic"
    },
    {
      "sender_name": "aaa",
      "timestamp_ms": 1540329262248,
      "content": "aaa",
      "type": "Generic"
    }
  ]
}

答案 1 :(得分:0)

您是否尝试过将json作为字典阅读并检查类型?您还可以在事实之后查找不需要的单词并将其删除。

import json
from collections import Counter

def get_words(string):
    return [word.lower() for word in string.split() if word.lower()]

def count_words(json_item):
    if isinstance(json_item, dict):
        for key, value in json_item.items():
            return count_words(key) + count_words(value)
    elif isinstance(value, str):
        return get_words(value)
    elif isinstance(value, list):
        return [word for string in value for word in count_words(string)]
    else:
        return []

with open('message.json', encoding="utf-8") as f:
    json_input = json.load(f)
counter = Counter(count_words(json_input))
result = { key: value for key, value in counter.items() if key not in UNWANTED_WORDS}