web-dev-qa-db-ja.com

ウィキペディアの記事から最初の段落を抽出する(Python)

Pythonを使用して、Wikipediaの記事から最初の段落を抽出するにはどうすればよいですか?

たとえば、Albert Einsteinの場合、次のようになります。

アルバートアインシュタイン(/ ˈælbərt ˈaɪnstaɪn /と発音:ドイツ語:[ˈalbɐt ˈaɪnʃtaɪn](聞く); 1879年3月14日-1955年4月18日)すべての時間の。ドイツ・スイス・ノーベル賞受賞者であるアインシュタインは、しばしば現代物理学の父と見なされています。[2]彼は「理論物理学への貢献、特に光電効果の法則の発見」で1921年のノーベル物理学賞を受賞しました。[3]

36
Alon Gubkin

しばらく前に、Wikipediaの記事をプレーンテキストで取得するために2つのクラスを作成しました。私はそれらが最良の解決策ではないことを知っていますが、あなたはあなたのニーズにそれを適応させることができます:

wikipedia.py
wiki2plain.py

次のように使用できます。

from wikipedia import Wikipedia
from wiki2plain import Wiki2Plain

lang = 'simple'
wiki = Wikipedia(lang)

try:
    raw = wiki.article('Uruguay')
except:
    raw = None

if raw:
    wiki2plain = Wiki2Plain(raw)
    content = wiki2plain.text
39
joksnet

これを非常に簡単にすることを目的としたPythonライブラリを作成しました。 Github で確認してください。

それをインストールするには、実行します

$ pip install wikipedia

次に、記事の最初の段落を取得するには、wikipedia.summary関数を使用します。

>>> import wikipedia
>>> print wikipedia.summary("Albert Einstein", sentences=2)

プリント

アルバートアインシュタイン(/ ˈælbərt ˈaɪnstaɪn /;ドイツ語:[ˈalbɐt ˈaɪnʃtaɪn](聞く); 1879年3月14日-1955年4月18日)は、現代物理学の2つの柱の1つである相対性理論の一般理論を開発したドイツ生まれの理論物理学者でした(量子力学とともに)。彼の質量エネルギー等価式E = mc2(「世界で最も有名な方程式」と呼ばれます)で最もよく知られていますが、彼は1921年のノーベル物理学賞を受賞しました。光電効果の法則」。

仕組みについては、wikipediaはMediaWiki APIの Mobile Frontend Extension にリクエストを行い、Wikipedia記事のモバイルフレンドリーバージョンを返します。具体的には、パラメーターprop=extracts&exsectionformat=plainを渡すことにより、MediaWikiサーバーはWikitextを解析し、ページテキスト全体を含む、リクエストしている記事のプレーンテキストの概要を返します。また、パラメータexcharsおよびexsentencesも受け入れます。これらは、当然のことながら、APIによって返される文字と文の数を制限します。

42
goldsmith

私がしたことはこれです:

import urllib
import urllib2
from BeautifulSoup import BeautifulSoup

article= "Albert Einstein"
article = urllib.quote(article)

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')] #wikipedia needs this

resource = opener.open("http://en.wikipedia.org/wiki/" + article)
data = resource.read()
resource.close()
soup = BeautifulSoup(data)
print soup.find('div',id="bodyContent").p
11
Jens Timmerman

ウィキペディアは、この機能をAPIモジュールとして提供するMediaWiki拡張を実行します。 TextExtractsaction=query&prop=extracts最初の[〜#〜] n [〜#〜]文および/または紹介だけをHTMLまたはプレーンテキストとして返すオプション付き。

作成したいAPI呼び出しを試してみてください: https://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Albert%20Einstein&exintro=&exsentences=2&explaintext=&redirects=&formatversion= 2

  • action=query&prop=extractsこの情報を要求するには
  • (ex)sentences = 2、(ex)intro =、(ex)plaintextは、イントロから2つの文をプレーンテキストとして要求するモジュールのパラメーターです(APIドキュメントの最初のリンクを参照)。 HTMLの場合は後者を省略します。
  • redirects=(true)したがって、「titles = Einstein」を要求すると、Albert Einsteinページ情報が表示されます。
  • formatversion=2 UTF-8のよりクリーンな形式。

DGundの回答にあるような、MediaWikiアクションAPIの呼び出しをラップするさまざまなライブラリがありますが、APIを自分で呼び出すのはそれほど難しくありません。

検索結果のページ情報 記事の説明とリード画像の取得とともに、このテキスト抽出の取得について説明します。

10
skierpage

ライブラリの提案が必要な場合は、 BeautifulSouprllib2 を思い出してください。 SO before: PythonによるWebスクレイピング

ウィキペディアからページを取得するためにurllib2を試しました。しかし、それは403(禁止)でした。 MediaWikiは、さまざまな出力形式をサポートするウィキペディアのAPIを提供します。 python-wikitoolsは使用していませんが、試してみる価値はあります。 http://code.google.com/p/python-wikitools/

2
dheerosaur

第一に、私は私が陰気ではないことを約束します。

役に立つかもしれない以前の質問は次のとおりです。 Pythonでウィキペディアの記事を取得する

この中で、誰かがこの質問につながるウィキペディアの高レベルAPIを使用することを提案します。

Wikipedia APIはありますか?

2
jaydel

比較的新しい REST API には、この使用に最適なsummaryメソッドがあり、他の回答(ウィキコードの削除など)で言及されている多くのことを実行します。該当する場合は、画像と地理座標も含まれます。

素敵なrequestsモジュールとPython 3:

import requests
r = requests.get("https://en.wikipedia.org/api/rest_v1/page/summary/Amsterdam")
page = r.json()
print(page["extract"]) # Returns 'Amsterdam is the capital and...'
1
Husky

他の人が言ったように、1つのアプローチはwikimedia APIとurllibまたはurllib2を使用することです。以下のコードフラグメントは、「リード」セクションと呼ばれるものを抽出するために使用したものの一部であり、記事の要約と情報ボックスがあります。これにより、返されたテキストが実際のコンテンツではなくリダイレ​​クトであるかどうかを確認し、情報ボックスが存在する場合はスキップすることもできます(私の場合、情報ボックスを引き出してフォーマットするために別のコードを使用しました)。

contentBaseURL='http://en.wikipedia.org/w/index.php?title='

def getContent(title):
    URL=contentBaseURL+title+'&action=raw&section=0'
    f=urllib.urlopen(URL)
    rawContent=f.read()
    return rawContent

infoboxPresent = 0
# Check if a redirect was returned.  If so, go to the redirection target
    if rawContent.find('#REDIRECT') == 0:
        rawContent = getFullContent(title)
        # extract the redirection title
        # Extract and format the Infobox
        redirectStart=rawContent.find('#REDIRECT[[')+11   
        count = 0
        redirectEnd = 0
        for i, char in enumerate(rawContent[redirectStart:-1]):
            if char == "[": count += 1
            if char == "]}":
                count -= 1
                if count == 0:
                    redirectEnd = i+redirectStart+1
                    break
        redirectTitle = rawContent[redirectStart:redirectEnd]
        print 'redirectTitle is: ',redirectTitle
        rawContent = getContent(redirectTitle)

    # Skip the Infobox
    infoboxStart=rawContent.find("{{Infobox")   #Actually starts at the double {'s before "Infobox"
    count = 0
    infoboxEnd = 0
    for i, char in enumerate(rawContent[infoboxStart:-1]):
        if char == "{": count += 1
        if char == "}":
            count -= 1
            if count == 0:
                infoboxEnd = i+infoboxStart+1
                break

    if infoboxEnd <> 0:
        rawContent = rawContent[infoboxEnd:]

Wikiマークアップを含む生のテキストを取得するため、いくつかのクリーンアップを行う必要があります。最初のセクション全体ではなく、最初の段落だけが必要な場合は、最初の改行文字を探します。

1
ViennaMike

patternを試してください。

pip install pattern

from pattern.web import Wikipedia
article = Wikipedia(language="af").search('Kaapstad', throttle=10)
print article.string
0
Superdooperhero

urllibを組み合わせてサイトを取得し、BeautifulSoupまたはlxmlを組み合わせてデータを解析します。

0
Johannes Charra