Python バージョン: 2.7.10
私のコード:
# -*- coding: utf-8 -*-
from urllib2 import urlopen
from bs4 import BeautifulSoup
from collections import OrderedDict
import re
import string
def cleanInput(input):
input = re.sub('\n+', " ", input)
input = re.sub('\[[0-9]*\]', "", input)
input = re.sub(' +', " ", input)
# input = bytes(input, "UTF-8")
input = bytearray(input, "UTF-8")
input = input.decode("ascii", "ignore")
cleanInput = []
input = input.split(' ')
for item in input:
item = item.strip(string.punctuation)
if len(item) > 1 or (item.lower() == 'a' or item.lower() == 'i'):
cleanInput.append(item)
return cleanInput
def ngrams(input, n):
input = cleanInput(input)
output = []
for i in range(len(input)-n+1):
output.append(input[i:i+n])
return output
url = 'https://en.wikipedia.org/wiki/Python_(programming_language)'
html = urlopen(url)
bsObj = BeautifulSoup(html, 'lxml')
content = bsObj.find("div", {"id": "mw-content-text"}).get_text()
ngrams = ngrams(content, 2)
keys = range(len(ngrams))
ngramsDic = {}
for i in range(len(keys)):
ngramsDic[keys[i]] = ngrams[i]
# ngrams = OrderedDict(sorted(ngrams.items(), key=lambda t: t[1], reverse=True))
ngrams = OrderedDict(sorted(ngramsDic.items(), key=lambda t: t[1], reverse=True))
print ngrams
print "2-grams count is: " + str(len(ngrams))
私は最近、本Web Scraping with Python: Collecting Data from the Modern Webに従って Web スクレイピングの方法を学びましたが、Chapter 7 Data Normalizationセクションでは、最初に本と同じようにコードを記述し、端末からエラーが発生しました。
Traceback (most recent call last):
File "2grams.py", line 40, in <module>
ngrams = OrderedDict(sorted(ngrams.items(), key=lambda t: t[1], reverse=True))
AttributeError: 'list' object has no attribute 'items'
したがって、エンティティが のリストである新しい辞書を作成して、コードを変更しましたngrams
。しかし、私はまったく異なる結果を得ました:
質問:
- 本が示すように結果を取得したい場合 (値と頻度でソートされている場合)、各 2 グラムの出現をカウントするために独自の行を作成する必要があります。または、本のコードには既にその機能がありました (本はpython 3コードでした)?github でサンプル コードを予約する
- 私の出力の頻度は、著者のものとはかなり異なっていました。たとえば、
[u'Software', u'Foundation']
37 回発生しましたが、40 回ではありませんでした。その違いの原因は何ですか (私のコード エラーでしょうか)?
本のスクリーンショット: