>  기사  >  백엔드 개발  >  위키피디아에 가장 많은 콘텐츠가 있는 국가는 어디인가요?

위키피디아에 가장 많은 콘텐츠가 있는 국가는 어디인가요?

王林
王林원래의
2024-08-29 18:31:00461검색

소개

인터넷에서 무언가를 검색해 보면 프랑스어 콘텐츠보다 영어 콘텐츠가 훨씬 더 포괄적이라는 것을 종종 발견합니다.

프랑스어 사용자에 비해 전 세계 영어 사용자의 수를 고려하면(약 4~5배 더 많음) 당연해 보일 수도 있지만, 저는 이 가설을 테스트하고 수량화하고 싶었습니다.

TLDR: 평균적으로 Wikipedia의 영어 기사에는 프랑스어 기사보다 19% 더 많은 정보가 포함되어 있습니다.

이 분석의 소스 코드는 https://github.com/jverneaut/wikipedia-analytics/에서 확인할 수 있습니다.

프로토콜

Wikipedia는 전 세계적으로 고품질 웹 콘텐츠를 제공하는 최대 규모의 소스 중 하나입니다.

이 기사를 작성할 당시 영어 버전에는 고유한 기사가 6,700,000개 이상 있었는데, 프랑스어 버전은 2,500,000개에 불과했습니다. 우리는 이 말뭉치를 연구의 기초로 삼을 것입니다.

몬테카를로 방법을 사용하여 각 언어에 대해 Wikipedia에서 무작위 기사를 샘플링하고 이 말뭉치의 평균 문자 길이를 계산합니다. 충분히 많은 수의 샘플을 가지고 현실에 가까운 결과를 얻어야 합니다.

Wikimedia API는 기사의 문자 길이를 가져오는 방법을 제공하지 않으므로 이 정보는 다음과 같이 가져옵니다.

  1. Wikimedia API를 통해 대규모 기사 샘플의 바이트 크기를 검색합니다.
  2. 몬테카를로 방법을 사용하여 작은 기사 샘플에서 문자당 바이트 수를 추정합니다.
  3. 2단계에서 얻은 문자당 바이트 추정값을 사용하여 많은 기사의 문자 수를 검색합니다.

몬테카를로 방식을 사용하여 문자당 바이트 수를 추정하므로 실제 개수와의 편차를 최소화하려면 최대한 많은 기사 개수가 필요합니다.

Wikimedia API 문서에는 다음 제한 사항이 명시되어 있습니다.

  • 요청당 무작위 기사는 500개 이하입니다.
  • 요청당 기사 내용은 50개 이하입니다.

이러한 제한 사항을 고려하고 정밀도와 쿼리 실행 시간 사이의 절충안으로 기사 바이트 길이에 대한 참조로 언어당 100,000개의 기사를 샘플링하고 각 언어의 문자당 바이트를 추정하기 위해 500개의 기사를 샘플링하기로 선택했습니다.

제한사항

현재 Wikimedia API는 기사의 콘텐츠를 제공하라는 요청을 받으면 자체 위키텍스트 형식을 반환합니다. 이 형식은 일반 텍스트가 아니며 HTML에 더 가깝습니다. Wikimedia의 모든 언어는 이와 동일한 형식을 사용하므로 최종 결과의 방향에 영향을 주지 않고 이에 의존할 수 있다고 판단했습니다.

그러나 일부 언어는 다른 언어보다 더 장황합니다. 예를 들어 프랑스어에서는 "Comment ça va?"라고 말합니다. (15자) "How are you?"와 비교 (12자) 영어로. 본 연구에서는 이러한 현상을 설명하지 않습니다. 이 문제를 해결하고 싶다면 동일한 책 코퍼스의 다양한 번역을 비교하여 언어에 대한 "밀도" 수정 변수를 설정할 수 있습니다. 제가 조사한 결과 각 언어에 적용할 수 있는 비율을 제공하는 데이터는 발견되지 않았습니다.

그런데 17개 언어의 정보 밀도와 언어 속도를 비교한 매우 흥미로운 논문을 발견했습니다. 그 결론은 가장 "효율적인" 언어가 가장 효율적인 언어보다 더 느리게 말해져 언어 정보 전송 속도가 지속적으로 초당 약 39비트라는 것입니다.

흥미롭습니다.

각 언어로 된 기사의 평균 바이트 길이를 가져옵니다.

프로토콜에 명시된 대로 Wikipedia API를 사용하여 특정 언어로 된 500개의 기사를 무작위로 검색합니다.

def getRandomArticlesUrl(locale):
    return "https://" + locale + ".wikipedia.org/w/api.php?action=query&generator=random&grnlimit=500&grnnamespace=0&prop=info&format=json"

def getRandomArticles(locale):
    url = getRandomArticlesUrl(locale)
    response = requests.get(url)
    return json.loads(response.content)["query"]["pages"]

그러면 다음과 같은 응답이 제공됩니다. { "id1": { "title": "...", "length": 1234 }, "id2": { "title": "...", "length ": 5678 }, ... } 이는 많은 기사의 크기를 바이트 단위로 검색하는 데 사용할 수 있습니다.

그런 다음 이 데이터를 재작업하여 다음 표를 얻습니다.

Language Average length ...
EN 8865.33259
FR 7566.10867
RU 10923.87673
JA  9865.59485
...

얼핏 보면 영어 기사가 프랑스어 기사보다 바이트 길이가 더 긴 것처럼 보입니다. 마찬가지로 러시아어의 바이트 길이는 다른 언어의 바이트 길이보다 큽니다.

Which country has the most content on Wikipedia?

이런 결론에서 멈춰야 할까요? 좀 빠지는. Wikipedia에서 보고된 길이는 바이트 단위의 길이이므로 이러한 초기 결과를 이해하려면 문자가 인코딩되는 방식에 대해 좀 더 자세히 알아볼 필요가 있습니다.

문자 인코딩 방법: UTF-8 소개

바이트란 무엇입니까?

당신이나 나와 달리 컴퓨터에는 알파벳은커녕 문자라는 개념도 없습니다. 이를 위해 모든 것은 0과 1의 연속으로 표현됩니다.

십진법에서는 0에서 1, 1에서 2, 이런 식으로 최대 10까지 진행합니다.

이진법을 사용하는 컴퓨터의 경우 0에서 1, 1에서 10, 10에서 11, 100 등으로 진행됩니다.

더 명확하게 설명하기 위한 비교표는 다음과 같습니다.

Decimal Binary
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
10 1010
...

이진수 학습은 이 기사의 범위를 훨씬 벗어나지만 숫자가 커질수록 이진수 표현이 십진수 표현에 비해 "더 넓어진다"는 것을 알 수 있습니다.

컴퓨터는 숫자를 구별해야 하기 때문에 숫자를 바이트라고 하는 8개 단위의 작은 패킷에 저장합니다. 1바이트는 8비트로 구성됩니다(예: 01001011).

UTF-8이 문자를 저장하는 방법

숫자를 저장하는 방법을 살펴보았는데 문자를 저장하는 방법이 조금 더 복잡해졌습니다.

많은 서구 국가에서 사용되는 우리 라틴 알파벳은 26자의 알파벳을 사용합니다. 0부터 25까지의 각 숫자가 문자에 해당하는 참조 테이블을 사용할 수는 없나요?

Letter Index Binary index
a 0 00000000
b 1 00000001
c 2 00000010
... ... ...
z 25 00011001

하지만 소문자보다 더 많은 문자가 있습니다. 이 간단한 문장에는 대문자, 쉼표, 마침표 등도 있습니다. ASCII 표준으로 알려진 단일 바이트 내에 이러한 모든 문자를 포함하도록 표준화된 목록이 만들어졌습니다.

컴퓨팅 초창기에는 기본적인 용도로는 ASCII이면 충분했습니다. 하지만 다른 캐릭터를 사용하고 싶다면 어떻게 해야 할까요? 키릴 문자(33자)는 어떻게 쓰나요? 이것이 UTF-8 표준이 만들어진 이유입니다.

UTF-8은 Unicode(Universal Coded Character Set) T변형 F형식 - 8비트를 나타냅니다. 컴퓨터가 하나 이상의 바이트를 사용하여 문자를 저장할 수 있도록 하는 인코딩 시스템입니다.

데이터에 사용된 바이트 수를 나타내기 위해 이 인코딩의 첫 번째 비트가 이 정보를 신호하는 데 사용됩니다.

First UTF-8 bits Number of bytes used
0xxxxxx 1
110xxxxx ... 2
1110xxxx ... ... 3
11110xxx ... ... ... 4

The following bits also have their purpose, but once again, this goes beyond the scope of this article. Just note that, at a minimum, a single bit can be used as a signature in cases where our character fits within the x1111111 = 127 remaining possibilities.

For English, which does not use accents, we can assume that most characters in an article will be encoded this way, and therefore the average number of bytes per character should be close to 1.

For French, which uses accents, cedillas, etc., we assume that this number will be higher.

Finally, for languages with a more extensive alphabet, such as Russian and Japanese, we can expect a higher number of bytes, which provides a starting point for explaining the results obtained earlier.

Get the average character length in bytes of articles for each language

Now that we understand what the value returned earlier by the Wikipedia API means, we want to calculate the number of bytes per character for each language in order to adjust these results.

To do this, we use a different way of accessing the Wikipedia API that allows us to obtain both the content of the articles and their byte length.

Why not use this API directly?

This API only returns 50 results per request, whereas the previous one returns 500. Therefore, in the same amount of time, we can get 10 times more results this way.

More concretely, if the API calls took 20 minutes with the first method, they would take 3 hours and 20 minutes with this approach.

def getRandomArticlesUrl(locale):
    return "https://" + locale + ".wikipedia.org/w/api.php?action=query&generator=random&grnlimit=50&grnnamespace=0&prop=revisions&rvprop=content|size&format=json"

def getRandomArticles(locale):
    url = getRandomArticlesUrl(locale)
    response = requests.get(url)
    return json.loads(response.content)["query"]["pages"]

Once this data is synthesized, here is an excerpt of what we get:

Language Bytes per character ...
EN 1.006978892420735
FR 1.0243214042939228
RU 1.5362439940531318
JA 1.843857157700553
...

So our intuition was correct: countries with a larger alphabet distort the data because of the way their content is stored.

We also see that French uses more bytes on average to store its characters than English as we previously assumed.

Results

We can now correct the data by changing from a size in bytes to a size in characters which gives us the following graph:

Which country has the most content on Wikipedia?

Our hypothesis is therefore confirmed.

On average, English is the language with the most content per page on Wikipedia. It is followed by French, then Russian, Spanish, and German.

The standard deviation (shown with the black bars) is large for this dataset, which means that the content size varies greatly from the shortest to the longest article. Therefore, it is difficult to establish a general truth for all articles, but this trend still seems consistent with my personal experience of Wikipedia.

If you want all the results from this experiment, I have also created this representation, which compares each language with its percentage of additional/less content relative to the others.

Which country has the most content on Wikipedia?

Thanks to this, we therefore find our conclusion that on average, an English article on Wikipedia contains 19% more information than its equivalent in French.

The source code for this analysis is available here: https://github.com/jverneaut/wikipedia-analysis/

위 내용은 위키피디아에 가장 많은 콘텐츠가 있는 국가는 어디인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:컴퓨터 비전: 소개다음 기사:컴퓨터 비전: 소개