Repository: explosion/spaCy
Pull request: Fixes  #5413
(Fixes #5314 )

Fixes change of format `{lang}wiki-latest-pages-articles.xml.bz2` which makes the `bin.entity_linking.wikipedia_processor._process_wp_text` not parse any article.

## Description
The code removes everything within the `<text >` tag before extracting the text.

### Types of change
Bug fix

## Checklist
- [X] I have submitted the spaCy Contributor Agreement.
- [X] I ran the tests, and all new and existing tests passed.
- [X] My changes don't require a change to the documentation, or if they do, I've added all required information.


Problem statement:
wikidata_pretrain_kb.py fails to process wiki articles due to change {lang}wiki-latest-pages-articles.xml.bz2
The format of {lang}wiki-latest-pages-articles.xml.bz2 has changed.

The text tag previous looked like this `<text xml:space="preserve">` but now look like this `<text bytes="{NUMBER}" xml:space="preserve">`

Thus, the function `bin.entity_linking.wikipedia_processor._process_wp_text` fails to parse any wikipedia article.

Hints from issue discussion:

Commit message: Add contributor

Patch to review:
diff --git a/.github/contributors/elben10 b/.github/contributors/elben10
new file mode 100644
index 00000000000..1eb4656dc81
--- /dev/null
+++ b/.github/contributors/elben10
@@ -0,0 +1,106 @@
+# spaCy contributor agreement
+
+This spaCy Contributor Agreement (**"SCA"**) is based on the
+[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
+The SCA applies to any contribution that you make to any product or project
+managed by us (the **"project"**), and sets out the intellectual property rights
+you grant to us in the contributed materials. The term **"us"** shall mean
+[ExplosionAI GmbH](https://explosion.ai/legal). The term
+**"you"** shall mean the person or entity identified below.
+
+If you agree to be bound by these terms, fill in the information requested
+below and include the filled-in version with your first pull request, under the
+folder [`.github/contributors/`](/.github/contributors/). The name of the file
+should be your GitHub username, with the extension `.md`. For example, the user
+example_user would create the file `.github/contributors/example_user.md`.
+
+Read this agreement carefully before signing. These terms and conditions
+constitute a binding legal agreement.
+
+## Contributor Agreement
+
+1. The term "contribution" or "contributed materials" means any source code,
+object code, patch, tool, sample, graphic, specification, manual,
+documentation, or any other material posted or submitted by you to the project.
+
+2. With respect to any worldwide copyrights, or copyright applications and
+registrations, in your contribution:
+
+    * you hereby assign to us joint ownership, and to the extent that such
+    assignment is or becomes invalid, ineffective or unenforceable, you hereby
+    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
+    royalty-free, unrestricted license to exercise all rights under those
+    copyrights. This includes, at our option, the right to sublicense these same
+    rights to third parties through multiple levels of sublicensees or other
+    licensing arrangements;
+
+    * you agree that each of us can do all things in relation to your
+    contribution as if each of us were the sole owners, and if one of us makes
+    a derivative work of your contribution, the one who makes the derivative
+    work (or has it made will be the sole owner of that derivative work;
+
+    * you agree that you will not assert any moral rights in your contribution
+    against us, our licensees or transferees;
+
+    * you agree that we may register a copyright in your contribution and
+    exercise all ownership rights associated with it; and
+
+    * you agree that neither of us has any duty to consult with, obtain the
+    consent of, pay or render an accounting to the other for any use or
+    distribution of your contribution.
+
+3. With respect to any patents you own, or that you can license without payment
+to any third party, you hereby grant to us a perpetual, irrevocable,
+non-exclusive, worldwide, no-charge, royalty-free license to:
+
+    * make, have made, use, sell, offer to sell, import, and otherwise transfer
+    your contribution in whole or in part, alone or in combination with or
+    included in any product, work or materials arising out of the project to
+    which your contribution was submitted, and
+
+    * at our option, to sublicense these same rights to third parties through
+    multiple levels of sublicensees or other licensing arrangements.
+
+4. Except as set out above, you keep all right, title, and interest in your
+contribution. The rights that you grant to us under these terms are effective
+on the date you first submitted a contribution to us, even if your submission
+took place before the date you sign these terms.
+
+5. You covenant, represent, warrant and agree that:
+
+    * Each contribution that you submit is and shall be an original work of
+    authorship and you can legally grant the rights set out in this SCA;
+
+    * to the best of your knowledge, each contribution will not violate any
+    third party's copyrights, trademarks, patents, or other intellectual
+    property rights; and
+
+    * each contribution shall be in compliance with U.S. export control laws and
+    other applicable export and import laws. You agree to notify us if you
+    become aware of any circumstance which would make any of the foregoing
+    representations inaccurate in any respect. We may publicly disclose your
+    participation in the project, including the fact that you have signed the SCA.
+
+6. This SCA is governed by the laws of the State of California and applicable
+U.S. Federal law. Any choice of law rules will not apply.
+
+7. Please place an “x” on one of the applicable statement below. Please do NOT
+mark both statements:
+
+    * [x] I am signing on behalf of myself as an individual and no other person
+    or entity, including my employer, has or will have rights with respect to my
+    contributions.
+
+    * [ ] I am signing on behalf of my employer or a legal entity and I have the
+    actual authority to contractually bind that entity.
+
+## Contributor Details
+
+| Field                          | Entry                |
+|------------------------------- | -------------------- |
+| Name                           | Jakob Jul Elben      |
+| Company name (if applicable)   | N/A                  |
+| Title or role (if applicable)  | N/A                  |
+| Date                           | April 16th, 2020     |
+| GitHub username                | elben10              |
+| Website (optional)             | N/A                  |
diff --git a/bin/wiki_entity_linking/wikipedia_processor.py b/bin/wiki_entity_linking/wikipedia_processor.py
index ed3c35c4320..649d48fe5b5 100644
--- a/bin/wiki_entity_linking/wikipedia_processor.py
+++ b/bin/wiki_entity_linking/wikipedia_processor.py
@@ -30,7 +30,8 @@
 
 title_regex = re.compile(r"(?<=<title>).*(?=</title>)")
 id_regex = re.compile(r"(?<=<id>)\d*(?=</id>)")
-text_regex = re.compile(r"(?<=<text xml:space=\"preserve\">).*(?=</text)")
+text_tag_regex = re.compile(r"(?<=<text).*?(?=>)")
+text_regex = re.compile(r"(?<=<text>).*(?=</text)")
 info_regex = re.compile(r"{[^{]*?}")
 html_regex = re.compile(r"&lt;!--[^-]*--&gt;")
 ref_regex = re.compile(r"&lt;ref.*?&gt;")  # non-greedy
@@ -285,7 +286,8 @@ def _process_wp_text(article_title, article_text, wp_to_id):
         return None, None
 
     # remove the text tags
-    text_search = text_regex.search(article_text)
+    text_search = text_tag_regex.sub("", article_text)
+    text_search = text_regex.search(text_search)
     if text_search is None:
         return None, None
     text = text_search.group(0)
diff --git a/spacy/tests/regression/test_issue5314.py b/spacy/tests/regression/test_issue5314.py
new file mode 100644
index 00000000000..744ccaab1fd
--- /dev/null
+++ b/spacy/tests/regression/test_issue5314.py
@@ -0,0 +1,10 @@
+from bin.wiki_entity_linking.wikipedia_processor import _process_wp_text
+
+title = "Arkæologi"
+
+text = """<text bytes="11456" xml:space="preserve">[[Fil:Archäologie schichtengrabung.jpg|thumb|Arkæologisk [[udgravning]] med profil.]] '''Arkæologi''' er studiet af tidligere tiders [[menneske]]lige [[aktivitet]], primært gennem studiet af menneskets materielle levn.</text>"""
+
+
+def test_issue_xxx():
+    clean_text, entities = _process_wp_text(title, text, {})
+    assert clean_text is not None


Code review comments:
diff_hunk: @@ -0,0 +1,10 @@
+from bin.wiki_entity_linking.wikipedia_processor import _process_wp_text
+
+title = "Arkæologi"
+
+text = """<text bytes="11456" xml:space="preserve">[[Fil:Archäologie schichtengrabung.jpg|thumb|Arkæologisk [[udgravning]] med profil.]] '''Arkæologi''' er studiet af tidligere tiders [[menneske]]lige [[aktivitet]], primært gennem studiet af menneskets materielle levn.</text>"""
+
+
+def test_issue_xxx():
+    clean_text, entities = _process_wp_text(title, text, {})
+    assert clean_text is not None
path: spacy/tests/regression/test_issue5314.py
text: @user1:
```suggestion
    assert clean_text.strip() == "Arkæologi er studiet af tidligere tiders menneskelige aktivitet, primært gennem studiet af menneskets materielle levn."
```

diff_hunk: @@ -0,0 +1,10 @@
+from bin.wiki_entity_linking.wikipedia_processor import _process_wp_text
+
+title = "Arkæologi"
+
+text = """<text bytes="11456" xml:space="preserve">[[Fil:Archäologie schichtengrabung.jpg|thumb|Arkæologisk [[udgravning]] med profil.]] '''Arkæologi''' er studiet af tidligere tiders [[menneske]]lige [[aktivitet]], primært gennem studiet af menneskets materielle levn.</text>"""
+
+
+def test_issue_xxx():
path: spacy/tests/regression/test_issue5314.py
text: @user1:
```suggestion
def test_issue5314():
```