citation-map 4.2__tar.gz → 4.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: citation-map
3
- Version: 4.2
3
+ Version: 4.3
4
4
  Summary: A simple tool to generate your Google Scholar citation world map.
5
5
  Home-page: https://github.com/ChenLiu-1996/CitationMap
6
6
  Author: Chen Liu
@@ -16,10 +16,11 @@ License-File: LICENSE.md
16
16
 
17
17
  # Google Scholar Citation World Map
18
18
 
19
+ [![TechRxiv](https://img.shields.io/badge/TechRxiv-darkviolet)](https://www.techrxiv.org/users/809001/articles/1213717-citationmap-a-python-tool-to-identify-and-visualize-your-google-scholar-citations-around-the-world)
20
+ [![OpenReview](https://img.shields.io/badge/OpenReview-firebrick)](https://openreview.net/pdf?id=BqJgCgl1IA)
19
21
  [![Latest PyPI version](https://img.shields.io/pypi/v/citation-map.svg)](https://pypi.org/project/citation-map/)
20
22
  [![PyPI download month](https://img.shields.io/pypi/dm/citation-map.svg)](https://pypistats.org/packages/citation-map)
21
23
  [![PyPI download day](https://img.shields.io/pypi/dd/citation-map.svg)](https://pypistats.org/packages/citation-map)
22
- [![made-with-python](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org/)
23
24
  [![CC BY-NC-SA 4.0][cc-by-nc-sa-shield]][cc-by-nc-sa]
24
25
  [![CC BY-NC-SA 4.0][cc-by-nc-sa-image]][cc-by-nc-sa]
25
26
 
@@ -27,13 +28,14 @@ License-File: LICENSE.md
27
28
  [cc-by-nc-sa-image]: https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png
28
29
  [cc-by-nc-sa-shield]: https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg
29
30
 
30
- [Chen Liu](https://www.chenliu1996.com/), CS PhD Candidate at Yale University.
31
+ [Chen Liu](https://chenliu-1996.github.io/), CS PhD Candidate at Yale University.
31
32
 
32
33
  Research areas: Machine Learning, Spatial-Temporal Modeling, Medical Vision, AI4Science.
33
34
 
35
+
34
36
  ## News
35
37
  **[Asking for advice]**
36
- 1. This is my first time dealing with webscraping/crawling. Users have reported stability issues, and I suspect the major problems are (1) being caught by CAPTCHA or robot check, and (2) being flagged for blacklist by Google Scholar. If you are experienced in these areas and have good advice, I would highly appreciate a GitHub issue or a pull request.
38
+ 1. This is my first time dealing with webscraping/crawling. Users have reported stability issues, and I suspect the major problems are (1) being caught by CAPTCHA or robot check, and (2) being flagged for blacklist by Google Scholar. If you are experienced in these areas and have good advice, I would highly appreciate a **GitHub issue or a pull request**.
37
39
 
38
40
  [Aug 2, 2024] Version 4.0 released >>> Logic update. A new input argument `affiliation_conservative`. If set to True, we will use **a very conservative approach to identify affiliations** which leads to **much higher precision and lower recall**. Many thanks to [Zhijian Liu](https://github.com/zhijian-liu) for the [helpful discussion](https://github.com/ChenLiu-1996/CitationMap/issues/8).
39
41
 
@@ -63,6 +65,29 @@ Besides, there will be a **CSV file** recording citation information (citing aut
63
65
 
64
66
  **NOTE:** **Now you can trade off between affiliation precision and recall** with the `affiliation_conservative` option. If set to True, we will use the Google Scholar verified official organization name from the citing authors. This is a very conservative approach, since (1) the author needs to self-report it in the affiliation panel, (2) the author needs to verify with the matching email address, and (3) the organization needs to be recorded by Google Scholar. For example, Meta (the company) is not in the list. Many thanks to [Zhijian Liu](https://github.com/zhijian-liu) for the [helpful discussion](https://github.com/ChenLiu-1996/CitationMap/issues/8).
65
67
 
68
+ ## Citation
69
+ BibTeX
70
+ ```
71
+ @article{citationmap,
72
+ title={CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World},
73
+ author={Liu, Chen},
74
+ journal={Authorea Preprints},
75
+ year={2024},
76
+ publisher={Authorea}
77
+ }
78
+ ```
79
+ MLA
80
+ ```
81
+ Liu, Chen. "CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World." Authorea Preprints (2024).
82
+ ```
83
+ APA
84
+ ```
85
+ Liu, C. (2024). CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World. Authorea Preprints.
86
+ ```
87
+ Chicago
88
+ ```
89
+ Liu, Chen. "CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World." Authorea Preprints (2024).
90
+ ```
66
91
 
67
92
  ## User Guide
68
93
  0. If you are new to Python, you probably want to start with a distribution of Python that also helps with environment management (such as [anaconda](https://www.anaconda.com/)). Once you have set up your environment (for example, when you reach the stage of `conda activate env39` in [this tutorial](https://www.youtube.com/watch?v=MUZtVEDKXsk&t=242s)), you can move on to the next step.
@@ -140,10 +165,12 @@ Besides, there will be a **CSV file** recording citation information (citing aut
140
165
  - Some authors citing you do not have Google Scholar profiles.
141
166
  - Some authors citing you do not report their affiliations.
142
167
  2. Webscraping is performed, and CAPTCHA or robot check can often get us, especially if we crawl frequently. This is more often seen in highly cited users. Unless you are blocked by Google Scholar, at worst you will end up with missing several citing authors, which is not likely a huge deal for highly cited users anyways.
143
- 3. `geopy.geocoders` is used to convert the citing authors' affiliations to geographic coordinates. To facilitate the process, I used some simple rule-based natural language processing to clean up the affiliations. As a result, you are expected to have:
144
- - Underestimation if the affiliations are not found by `geopy.geocoders`.
145
- - Underestimation if we experience communication error with `geopy.geocoders`.
146
- - Overestimation if non-affiliation phrases are incorrectly identified as locations by `geopy.geocoders`. (Only relevant if `affiliation_conservative` is set to False.)
168
+ 3. Affiliation identification and geolocating issues. This is a joint effect between affiliation identification and geolocating. The number of citing affiliations will be:
169
+ - Underestimated if some affiliations are not found by `geopy.geocoders`.
170
+ - Underestimated if we experience communication errors with `geopy.geocoders`.
171
+ - (Aggressive approach only) Overestimated if non-affiliation phrases are incorrectly identified as locations by `geopy.geocoders`.
172
+ - (Conservative approach only) Underestimated if the citer did not verify with an email address under a matching affiliation domain.
173
+ - (Conservative approach only) Underestimated because all non-primary (with verified email address) affiliations are ignored.
147
174
 
148
175
  **Please raise an issue or submit a pull request if you have some good idea to better process the affiliation string. Note that currently I am not considering any paid service or tools that pose extra burden on the users, such as GPT API.**
149
176
 
@@ -1,9 +1,10 @@
1
1
  # Google Scholar Citation World Map
2
2
 
3
+ [![TechRxiv](https://img.shields.io/badge/TechRxiv-darkviolet)](https://www.techrxiv.org/users/809001/articles/1213717-citationmap-a-python-tool-to-identify-and-visualize-your-google-scholar-citations-around-the-world)
4
+ [![OpenReview](https://img.shields.io/badge/OpenReview-firebrick)](https://openreview.net/pdf?id=BqJgCgl1IA)
3
5
  [![Latest PyPI version](https://img.shields.io/pypi/v/citation-map.svg)](https://pypi.org/project/citation-map/)
4
6
  [![PyPI download month](https://img.shields.io/pypi/dm/citation-map.svg)](https://pypistats.org/packages/citation-map)
5
7
  [![PyPI download day](https://img.shields.io/pypi/dd/citation-map.svg)](https://pypistats.org/packages/citation-map)
6
- [![made-with-python](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org/)
7
8
  [![CC BY-NC-SA 4.0][cc-by-nc-sa-shield]][cc-by-nc-sa]
8
9
  [![CC BY-NC-SA 4.0][cc-by-nc-sa-image]][cc-by-nc-sa]
9
10
 
@@ -11,13 +12,14 @@
11
12
  [cc-by-nc-sa-image]: https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png
12
13
  [cc-by-nc-sa-shield]: https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg
13
14
 
14
- [Chen Liu](https://www.chenliu1996.com/), CS PhD Candidate at Yale University.
15
+ [Chen Liu](https://chenliu-1996.github.io/), CS PhD Candidate at Yale University.
15
16
 
16
17
  Research areas: Machine Learning, Spatial-Temporal Modeling, Medical Vision, AI4Science.
17
18
 
19
+
18
20
  ## News
19
21
  **[Asking for advice]**
20
- 1. This is my first time dealing with webscraping/crawling. Users have reported stability issues, and I suspect the major problems are (1) being caught by CAPTCHA or robot check, and (2) being flagged for blacklist by Google Scholar. If you are experienced in these areas and have good advice, I would highly appreciate a GitHub issue or a pull request.
22
+ 1. This is my first time dealing with webscraping/crawling. Users have reported stability issues, and I suspect the major problems are (1) being caught by CAPTCHA or robot check, and (2) being flagged for blacklist by Google Scholar. If you are experienced in these areas and have good advice, I would highly appreciate a **GitHub issue or a pull request**.
21
23
 
22
24
  [Aug 2, 2024] Version 4.0 released >>> Logic update. A new input argument `affiliation_conservative`. If set to True, we will use **a very conservative approach to identify affiliations** which leads to **much higher precision and lower recall**. Many thanks to [Zhijian Liu](https://github.com/zhijian-liu) for the [helpful discussion](https://github.com/ChenLiu-1996/CitationMap/issues/8).
23
25
 
@@ -47,6 +49,29 @@ Besides, there will be a **CSV file** recording citation information (citing aut
47
49
 
48
50
  **NOTE:** **Now you can trade off between affiliation precision and recall** with the `affiliation_conservative` option. If set to True, we will use the Google Scholar verified official organization name from the citing authors. This is a very conservative approach, since (1) the author needs to self-report it in the affiliation panel, (2) the author needs to verify with the matching email address, and (3) the organization needs to be recorded by Google Scholar. For example, Meta (the company) is not in the list. Many thanks to [Zhijian Liu](https://github.com/zhijian-liu) for the [helpful discussion](https://github.com/ChenLiu-1996/CitationMap/issues/8).
49
51
 
52
+ ## Citation
53
+ BibTeX
54
+ ```
55
+ @article{citationmap,
56
+ title={CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World},
57
+ author={Liu, Chen},
58
+ journal={Authorea Preprints},
59
+ year={2024},
60
+ publisher={Authorea}
61
+ }
62
+ ```
63
+ MLA
64
+ ```
65
+ Liu, Chen. "CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World." Authorea Preprints (2024).
66
+ ```
67
+ APA
68
+ ```
69
+ Liu, C. (2024). CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World. Authorea Preprints.
70
+ ```
71
+ Chicago
72
+ ```
73
+ Liu, Chen. "CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World." Authorea Preprints (2024).
74
+ ```
50
75
 
51
76
  ## User Guide
52
77
  0. If you are new to Python, you probably want to start with a distribution of Python that also helps with environment management (such as [anaconda](https://www.anaconda.com/)). Once you have set up your environment (for example, when you reach the stage of `conda activate env39` in [this tutorial](https://www.youtube.com/watch?v=MUZtVEDKXsk&t=242s)), you can move on to the next step.
@@ -124,10 +149,12 @@ Besides, there will be a **CSV file** recording citation information (citing aut
124
149
  - Some authors citing you do not have Google Scholar profiles.
125
150
  - Some authors citing you do not report their affiliations.
126
151
  2. Webscraping is performed, and CAPTCHA or robot check can often get us, especially if we crawl frequently. This is more often seen in highly cited users. Unless you are blocked by Google Scholar, at worst you will end up with missing several citing authors, which is not likely a huge deal for highly cited users anyways.
127
- 3. `geopy.geocoders` is used to convert the citing authors' affiliations to geographic coordinates. To facilitate the process, I used some simple rule-based natural language processing to clean up the affiliations. As a result, you are expected to have:
128
- - Underestimation if the affiliations are not found by `geopy.geocoders`.
129
- - Underestimation if we experience communication error with `geopy.geocoders`.
130
- - Overestimation if non-affiliation phrases are incorrectly identified as locations by `geopy.geocoders`. (Only relevant if `affiliation_conservative` is set to False.)
152
+ 3. Affiliation identification and geolocating issues. This is a joint effect between affiliation identification and geolocating. The number of citing affiliations will be:
153
+ - Underestimated if some affiliations are not found by `geopy.geocoders`.
154
+ - Underestimated if we experience communication errors with `geopy.geocoders`.
155
+ - (Aggressive approach only) Overestimated if non-affiliation phrases are incorrectly identified as locations by `geopy.geocoders`.
156
+ - (Conservative approach only) Underestimated if the citer did not verify with an email address under a matching affiliation domain.
157
+ - (Conservative approach only) Underestimated because all non-primary (with verified email address) affiliations are ignored.
131
158
 
132
159
  **Please raise an issue or submit a pull request if you have some good idea to better process the affiliation string. Note that currently I am not considering any paid service or tools that pose extra burden on the users, such as GPT API.**
133
160
 
@@ -21,7 +21,8 @@ from .scholarly_support import get_citing_author_ids_and_citing_papers, get_orga
21
21
 
22
22
  def find_all_citing_authors(scholar_id: str, num_processes: int = 16) -> List[Tuple[str]]:
23
23
  '''
24
- Step 1. Find all citing authors.
24
+ Step 1. Find all publications of the given Google Scholar ID.
25
+ Step 2. Find all citing authors.
25
26
  '''
26
27
  # Find Google Scholar Profile using Scholar ID.
27
28
  author = scholarly.search_author_id(scholar_id)
@@ -70,7 +71,7 @@ def find_all_citing_affiliations(all_citing_author_paper_tuple_list: List[Tuple[
70
71
  num_processes: int = 16,
71
72
  affiliation_conservative: bool = False):
72
73
  '''
73
- Step 2. Find all citing affiliations.
74
+ Step 3. Find all citing affiliations.
74
75
  '''
75
76
  if affiliation_conservative:
76
77
  __affiliations_from_authors = __affiliations_from_authors_conservative
@@ -96,7 +97,7 @@ def find_all_citing_affiliations(all_citing_author_paper_tuple_list: List[Tuple[
96
97
 
97
98
  def clean_affiliation_names(author_paper_affiliation_tuple_list: List[Tuple[str]]) -> List[Tuple[str]]:
98
99
  '''
99
- Step 3 (Optional). Clean up the names of affiliations from the authors' affiliation tab on their Google Scholar profiles.
100
+ Optional Step. Clean up the names of affiliations from the authors' affiliation tab on their Google Scholar profiles.
100
101
  NOTE: This logic is very naive. Please send an issue or pull request if you have any idea how to improve it.
101
102
  Currently we will not consider any paid service or tools that pose extra burden on the users, such as GPT API.
102
103
  '''
@@ -386,7 +387,8 @@ def generate_citation_map(scholar_id: str,
386
387
  if cache_path is None or not os.path.exists(cache_path):
387
388
  print('No cache found for this author. Running from scratch.\n')
388
389
 
389
- # NOTE: Step 1. Find all citing authors.
390
+ # NOTE: Step 1. Find all publications of the given Google Scholar ID.
391
+ # Step 2. Find all citing authors.
390
392
  all_citing_author_paper_tuple_list = find_all_citing_authors(scholar_id=scholar_id,
391
393
  num_processes=num_processes)
392
394
  print('A total of %d citing authors recorded.\n' % len(all_citing_author_paper_tuple_list))
@@ -397,7 +399,8 @@ def generate_citation_map(scholar_id: str,
397
399
  else:
398
400
  print('Cache found. Loading author paper affiliation information from cache.\n')
399
401
 
400
- # NOTE: Step 1. Load all citing authors.
402
+ # NOTE: Step 1. Find all publications of the given Google Scholar ID.
403
+ # Step 2. Find all citing authors.
401
404
  all_citing_author_paper_tuple_list = load_cache(cache_path)
402
405
  print('Loaded from cache: %s.\n' % cache_path)
403
406
  print('A total of %d citing authors loaded.\n' % len(all_citing_author_paper_tuple_list))
@@ -7,6 +7,35 @@ from bs4 import BeautifulSoup
7
7
  from typing import List
8
8
 
9
9
 
10
+ def get_html_per_citation_page(soup) -> List[str]:
11
+ '''
12
+ Utility to query each page containing results for
13
+ cited work.
14
+ Parameters
15
+ --------
16
+ soup: Beautiful Soup object pointing to current page.
17
+ '''
18
+ citing_authors_and_citing_papers = []
19
+
20
+ for result in soup.find_all('div', class_='gs_ri'):
21
+ title_tag = result.find('h3', class_='gs_rt')
22
+ if title_tag:
23
+ paper_parsed = False
24
+ author_links = result.find_all('a', href=True)
25
+ title_text = title_tag.get_text()
26
+ title = title_text.replace('[HTML]', '').replace('[PDF]', '')
27
+ for link in author_links:
28
+ if 'user=' in link['href']:
29
+ author_id = link['href'].split('user=')[1].split('&')[0]
30
+ citing_authors_and_citing_papers.append((author_id, title))
31
+ paper_parsed = True
32
+ if not paper_parsed:
33
+ print("[WARNING!] Could not find author links for ", title_text)
34
+ else:
35
+ continue
36
+ return citing_authors_and_citing_papers
37
+
38
+
10
39
  def get_citing_author_ids_and_citing_papers(paper_url: str) -> List[str]:
11
40
  '''
12
41
  Find the (Google Scholar IDs of authors, titles of papers) who cite a given paper on Google Scholar.
@@ -15,7 +44,6 @@ def get_citing_author_ids_and_citing_papers(paper_url: str) -> List[str]:
15
44
  --------
16
45
  paper_url: URL of the paper BEING cited.
17
46
  '''
18
-
19
47
  citing_authors_and_citing_papers = []
20
48
 
21
49
  headers = requests.utils.default_headers()
@@ -44,36 +72,25 @@ def get_citing_author_ids_and_citing_papers(paper_url: str) -> List[str]:
44
72
 
45
73
  # Loop through the citation results and find citing authors and papers.
46
74
  current_page_number = 1
47
- while True:
48
- for result in soup.find_all('div', class_='gs_ri'):
49
- title_tag = result.find('h3', class_='gs_rt')
50
- if title_tag:
51
- author_links = result.find_all('a', href=True)
52
- title = title_tag.get_text().replace('[HTML]', '').replace('[PDF]', '')
53
- for link in author_links:
54
- if 'user=' in link['href']:
55
- author_id = link['href'].split('user=')[1].split('&')[0]
56
- citing_authors_and_citing_papers.append((author_id, title))
57
- else:
58
- continue
59
-
60
- # Find the page navigation.
61
- navigation_buttons = soup.find_all('a', class_='gs_nma')
62
- for navigation in navigation_buttons:
63
- page_number_str = navigation.text
64
- if page_number_str and page_number_str.isnumeric() and int(page_number_str) == current_page_number + 1:
65
- # Found the correct button for next page.
66
- current_page_number += 1
67
- next_url = 'https://scholar.google.com' + navigation['href']
68
- time.sleep(random.uniform(1, 5)) # Random delay to reduce risk of being blocked.
69
- response = requests.get(next_url, headers=headers)
70
- if response.status_code != 200:
71
- break
72
- soup = BeautifulSoup(response.text, 'html.parser')
73
- else:
74
- continue
75
+ citing_authors_and_citing_papers += get_html_per_citation_page(soup)
76
+
77
+ # Find the page navigation.
78
+ navigation_buttons = soup.find_all('a', class_='gs_nma')
79
+ for navigation in navigation_buttons:
80
+ page_number_str = navigation.text
81
+ if page_number_str and page_number_str.isnumeric() and int(page_number_str) == current_page_number + 1:
82
+ # Found the correct button for next page.
83
+ current_page_number += 1
84
+ next_url = 'https://scholar.google.com' + navigation['href']
85
+ time.sleep(random.uniform(1, 5)) # Random delay to reduce risk of being blocked.
86
+
87
+ response = requests.get(next_url, headers=headers)
88
+ if response.status_code != 200:
89
+ break
90
+ soup = BeautifulSoup(response.text, 'html.parser')
91
+ citing_authors_and_citing_papers += get_html_per_citation_page(soup)
75
92
  else:
76
- break
93
+ continue
77
94
 
78
95
  return citing_authors_and_citing_papers
79
96
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: citation-map
3
- Version: 4.2
3
+ Version: 4.3
4
4
  Summary: A simple tool to generate your Google Scholar citation world map.
5
5
  Home-page: https://github.com/ChenLiu-1996/CitationMap
6
6
  Author: Chen Liu
@@ -16,10 +16,11 @@ License-File: LICENSE.md
16
16
 
17
17
  # Google Scholar Citation World Map
18
18
 
19
+ [![TechRxiv](https://img.shields.io/badge/TechRxiv-darkviolet)](https://www.techrxiv.org/users/809001/articles/1213717-citationmap-a-python-tool-to-identify-and-visualize-your-google-scholar-citations-around-the-world)
20
+ [![OpenReview](https://img.shields.io/badge/OpenReview-firebrick)](https://openreview.net/pdf?id=BqJgCgl1IA)
19
21
  [![Latest PyPI version](https://img.shields.io/pypi/v/citation-map.svg)](https://pypi.org/project/citation-map/)
20
22
  [![PyPI download month](https://img.shields.io/pypi/dm/citation-map.svg)](https://pypistats.org/packages/citation-map)
21
23
  [![PyPI download day](https://img.shields.io/pypi/dd/citation-map.svg)](https://pypistats.org/packages/citation-map)
22
- [![made-with-python](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org/)
23
24
  [![CC BY-NC-SA 4.0][cc-by-nc-sa-shield]][cc-by-nc-sa]
24
25
  [![CC BY-NC-SA 4.0][cc-by-nc-sa-image]][cc-by-nc-sa]
25
26
 
@@ -27,13 +28,14 @@ License-File: LICENSE.md
27
28
  [cc-by-nc-sa-image]: https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png
28
29
  [cc-by-nc-sa-shield]: https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg
29
30
 
30
- [Chen Liu](https://www.chenliu1996.com/), CS PhD Candidate at Yale University.
31
+ [Chen Liu](https://chenliu-1996.github.io/), CS PhD Candidate at Yale University.
31
32
 
32
33
  Research areas: Machine Learning, Spatial-Temporal Modeling, Medical Vision, AI4Science.
33
34
 
35
+
34
36
  ## News
35
37
  **[Asking for advice]**
36
- 1. This is my first time dealing with webscraping/crawling. Users have reported stability issues, and I suspect the major problems are (1) being caught by CAPTCHA or robot check, and (2) being flagged for blacklist by Google Scholar. If you are experienced in these areas and have good advice, I would highly appreciate a GitHub issue or a pull request.
38
+ 1. This is my first time dealing with webscraping/crawling. Users have reported stability issues, and I suspect the major problems are (1) being caught by CAPTCHA or robot check, and (2) being flagged for blacklist by Google Scholar. If you are experienced in these areas and have good advice, I would highly appreciate a **GitHub issue or a pull request**.
37
39
 
38
40
  [Aug 2, 2024] Version 4.0 released >>> Logic update. A new input argument `affiliation_conservative`. If set to True, we will use **a very conservative approach to identify affiliations** which leads to **much higher precision and lower recall**. Many thanks to [Zhijian Liu](https://github.com/zhijian-liu) for the [helpful discussion](https://github.com/ChenLiu-1996/CitationMap/issues/8).
39
41
 
@@ -63,6 +65,29 @@ Besides, there will be a **CSV file** recording citation information (citing aut
63
65
 
64
66
  **NOTE:** **Now you can trade off between affiliation precision and recall** with the `affiliation_conservative` option. If set to True, we will use the Google Scholar verified official organization name from the citing authors. This is a very conservative approach, since (1) the author needs to self-report it in the affiliation panel, (2) the author needs to verify with the matching email address, and (3) the organization needs to be recorded by Google Scholar. For example, Meta (the company) is not in the list. Many thanks to [Zhijian Liu](https://github.com/zhijian-liu) for the [helpful discussion](https://github.com/ChenLiu-1996/CitationMap/issues/8).
65
67
 
68
+ ## Citation
69
+ BibTeX
70
+ ```
71
+ @article{citationmap,
72
+ title={CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World},
73
+ author={Liu, Chen},
74
+ journal={Authorea Preprints},
75
+ year={2024},
76
+ publisher={Authorea}
77
+ }
78
+ ```
79
+ MLA
80
+ ```
81
+ Liu, Chen. "CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World." Authorea Preprints (2024).
82
+ ```
83
+ APA
84
+ ```
85
+ Liu, C. (2024). CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World. Authorea Preprints.
86
+ ```
87
+ Chicago
88
+ ```
89
+ Liu, Chen. "CitationMap: A Python Tool to Identify and Visualize Your Google Scholar Citations Around the World." Authorea Preprints (2024).
90
+ ```
66
91
 
67
92
  ## User Guide
68
93
  0. If you are new to Python, you probably want to start with a distribution of Python that also helps with environment management (such as [anaconda](https://www.anaconda.com/)). Once you have set up your environment (for example, when you reach the stage of `conda activate env39` in [this tutorial](https://www.youtube.com/watch?v=MUZtVEDKXsk&t=242s)), you can move on to the next step.
@@ -140,10 +165,12 @@ Besides, there will be a **CSV file** recording citation information (citing aut
140
165
  - Some authors citing you do not have Google Scholar profiles.
141
166
  - Some authors citing you do not report their affiliations.
142
167
  2. Webscraping is performed, and CAPTCHA or robot check can often get us, especially if we crawl frequently. This is more often seen in highly cited users. Unless you are blocked by Google Scholar, at worst you will end up with missing several citing authors, which is not likely a huge deal for highly cited users anyways.
143
- 3. `geopy.geocoders` is used to convert the citing authors' affiliations to geographic coordinates. To facilitate the process, I used some simple rule-based natural language processing to clean up the affiliations. As a result, you are expected to have:
144
- - Underestimation if the affiliations are not found by `geopy.geocoders`.
145
- - Underestimation if we experience communication error with `geopy.geocoders`.
146
- - Overestimation if non-affiliation phrases are incorrectly identified as locations by `geopy.geocoders`. (Only relevant if `affiliation_conservative` is set to False.)
168
+ 3. Affiliation identification and geolocating issues. This is a joint effect between affiliation identification and geolocating. The number of citing affiliations will be:
169
+ - Underestimated if some affiliations are not found by `geopy.geocoders`.
170
+ - Underestimated if we experience communication errors with `geopy.geocoders`.
171
+ - (Aggressive approach only) Overestimated if non-affiliation phrases are incorrectly identified as locations by `geopy.geocoders`.
172
+ - (Conservative approach only) Underestimated if the citer did not verify with an email address under a matching affiliation domain.
173
+ - (Conservative approach only) Underestimated because all non-primary (with verified email address) affiliations are ignored.
147
174
 
148
175
  **Please raise an issue or submit a pull request if you have some good idea to better process the affiliation string. Note that currently I am not considering any paid service or tools that pose extra burden on the users, such as GPT API.**
149
176
 
@@ -5,7 +5,7 @@ with open('README.md') as f:
5
5
 
6
6
  setup(
7
7
  name='citation-map',
8
- version='4.2',
8
+ version='4.3',
9
9
  license='CC BY-NC-SA',
10
10
  author='Chen Liu',
11
11
  author_email='chen.liu.cl2482@yale.edu',
File without changes
File without changes