我想创建Facebook上'my
'和'my gf
'之间的常用单词的可视化。我直接从FB将所有消息下载到JSON文件中,并且计数器正常工作
但是:
sender_name
”或13
位数字的时间戳\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"
},
答案 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
进一步
更新
鉴于文件的格式,您需要将以下内容更改为:Counter
到data = 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}