diff --git a/.bumpversion.cfg b/.bumpversion.cfg new file mode 100644 index 0000000..f55b03b --- /dev/null +++ b/.bumpversion.cfg @@ -0,0 +1,6 @@ +[bumpversion] +current_version = 1.0.1 +commit = True +tag = True + +[bumpversion:file:setup.py] \ No newline at end of file diff --git a/.github/workflows/deploy-to-pypi.yml b/.github/workflows/deploy-to-pypi.yml new file mode 100644 index 0000000..16034d2 --- /dev/null +++ b/.github/workflows/deploy-to-pypi.yml @@ -0,0 +1,42 @@ +name: Publish Python Package to PyPI + +on: + push: + branches: + - master + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # Ensures tags are fetched + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' # Use the version appropriate for your project + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install build twine bump2version + + #- name: Configure Git + # run: | + # git config --global user.name "GitHub Actions" + # git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + + #- name: Bump version and push tag + # run: | + # bump2version patch # or 'minor' or 'major' depending on the release type + # git push --tags + + - name: Build and publish + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + run: | + python -m build + twine upload dist/* diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b878c57..618bf7e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,6 @@ on: jobs: build: - runs-on: ubuntu-latest strategy: @@ -26,5 +25,9 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt + - name: Install the package + run: pip install -e . - name: Test with unittest run: python -m unittest + - name: Test CLI Command + run: sortgs 'machine learning' --nresults 10 diff --git a/.gitignore b/.gitignore index 6f63f05..177b997 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,9 @@ ipython_config.py # Other variables .DS_Store -.vscode/ \ No newline at end of file +.vscode/ + +# Ignore egg-info, dist folders and build +*.egg-info +dist +build \ No newline at end of file diff --git a/README.md b/README.md index 3604435..e808aed 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,30 @@ -# Sort Google Scholar by the Number of Citations V2.0b -This Python code ranks publications data from Google Scholar by the number -of citations. It is useful for finding relevant papers in a specific field. - -The data acquired from Google Scholar is Title, Citations, Links and Rank. A new -columns with the number of citations per year is also included. -The example of the code will look for the top 100 papers related to the keyword, -and rank them by the number of citations. This keyword can eiter be included in -the command line terminal (`$python sortgs.py --kw 'my keyword'`) or edited in -the original file. -As output, a .csv file will be returned with the name of the chosen keyword -ranked by the number of citations. - -## UPDATES -- Try running the code using Google Colab -> [](https://colab.research.google.com/github/WittmannF/sort-google-scholar/blob/master/Test_sortgs_py_on_Colab.ipynb) - - No install requirements! Limitations: Can't handle robot checking, so use it carefully. -- Command line arguments. Ex: `$python sortgs.py --kw "deep learning"` (results saved in `deep_learning.csv`) -- Handling robot checking with selenium. - - OBS: You might be asked to manually solve the first captcha for retrieving the content of the pages +# Sort Google Scholar by the Number of Citations +[![PyPI Version](https://img.shields.io/pypi/v/sortgs.svg)](https://pypi.org/project/sortgs/) + +sortgs is a Python tool for ranking Google Scholar publications by the number of citations. It is useful for finding relevant papers in a specific field. The data acquired from Google Scholar includes Title, Citations, Links, Rank, and a new column with the number of citations per year. In the background, it first try to fetch results using python requests. If it fails, it will use selenium to fetch the results. + +## Try on Google Colab: [](https://colab.research.google.com/github/WittmannF/sort-google-scholar/blob/add_project_to_pypi/examples/run_sortgs_on_colab.ipynb) + - No install requirements! Limitations: Can't handle robot checking, so use it carefully. + +## Installation + +You can now install `sortgs` directly using `pip`: + +```bash +pip install sortgs +``` + +This will install the latest version of `sortgs` and its dependencies. + +## Usage + +Once installed, you can run `sortgs` directly from the command line: + +```bash +sortgs "your keyword" +``` + +Replace `"your keyword"` with any keyword you'd like to search for. A CSV file with the name `your_keyword.csv` will be created in your current directory. ## Misc If this project was helpful to you in any way, feel free to buy me a cup of coffee :) @@ -25,106 +33,95 @@ If this project was helpful to you in any way, feel free to buy me a cup of coff For a feedback, send me an email: fernando [dot] wittmann [at] gmail [dot] com +### Command Line Arguments -## Usage of `sortgs.py` -``` -usage: sortgs.py [-h] [--kw KEYWORD] [--sortby SORTBY] [--nresults NRESULTS] - [--csvpath CSVPATH] [--notsavecsv] [--plotresults] - [--startyear STARTYEAR] [--endyear ENDYEAR] +```bash +usage: sortgs [-h] [--sortby SORTBY] [--nresults NRESULTS] [--csvpath CSVPATH] + [--notsavecsv] [--plotresults] [--startyear STARTYEAR] + [--endyear ENDYEAR] [--debug] kw -Example: $python sortgs.py --kw 'deep learning' +positional arguments: + kw Keyword to be searched. Use double quote followed by + simple quote for an exact keyword. + Example: sortgs "'exact keyword'" optional arguments: -h, --help show this help message and exit - --kw KEYWORD Keyword to be searched. Default is 'machine learning' - Use double quote followed by simple quote to search - for an exact keyword. Example: "'exact keyword'" - --sortby SORTBY Column to be sorted by. Default is by the columns - "Citations", i.e., it will be sorted by the number of - citations. If you want to sort by citations per year, - use --sortby "cit/year" - --nresults NRESULTS Number of articles to search on Google Scholar. - Default is 100. (carefull with robot checking if value - is too high) - --csvpath CSVPATH Path to save the exported csv file. By default it is - the current folder - --notsavecsv By default results are going to be exported to a csv - file. Select this option to just print results but not - store them - --plotresults Use this flag in order to plot the results with the - original rank in the x-axis and the number of citaions - in the y-axis. Default is False + --sortby SORTBY Column to be sorted by. Default is "Citations". To sort + by citations per year, use --sortby "cit/year" + --nresults NRESULTS Number of articles to search on Google Scholar. Default + is 100. (careful with robot checking if value is high) + --csvpath CSVPATH Path to save the exported csv file. Default is the + current folder + --notsavecsv By default, results are exported to a csv file. Select + this option to just print results but not store them + --plotresults Use this flag to plot results with the original rank on + the x-axis and the number of citations on the y-axis. + Default is False --startyear STARTYEAR Start year when searching. Default is None --endyear ENDYEAR End year when searching. Default is current year + --debug Debug mode. Used for unit testing. It will get pages + stored on web archive ``` -## Example -The following code will search for the top 100 results, rank by number of citations and save as a .csv file (same name of the keyword): -``` -$python sortgs.py --kw "machine learning" -``` +### Examples -Sorted by number of citations per year (**HIGHLY RECOMMENDED**): -``` -$python sortgs.py --kw "machine learning" --sortby "cit/year" -``` +1. **Default Search**: + ```bash + sortgs "machine learning" + ``` + This command searches for the top 100 results related to "machine learning" and saves them as a CSV file. -From 2005 to 2015: -``` -$python sortgs.py --kw "machine learning" --startyear 2005 --endyear 2015 -``` +2. **Sort by Citations per Year**: + ```bash + sortgs "machine learning" --sortby "cit/year" + ``` + Search for "machine learning" and sort by the number of citations per year. -Search for an exact keywork: -``` -$python sortgs.py --kw "'machine learning'" -``` +3. **Specify Date Range**: + ```bash + sortgs "machine learning" --startyear 2005 --endyear 2015 + ``` + Search for papers from 2005 to 2015. -Save results under a subfolder called 'examples' -``` -$python sortgs.py --kw 'neural networks' --csvpath './examples/' -``` +4. **Search for an Exact Keyword**: + ```bash + sortgs "'machine learning'" + ``` -You can also add multiple keywords by fencing them with a single quote: -``` -$python sortgs.py --kw '"deep learning" OR "neural networks" OR "machine learning"' --sortby "cit/year" -``` +5. **Save Results in a Specific Path**: + ```bash + sortgs 'neural networks' --csvpath './examples/' + ``` + This will save the results under a subfolder called 'examples'. + +6. **Multiple Keywords**: + ```bash + sortgs '"deep learning" OR "neural networks" OR "machine learning"' --sortby "cit/year" + ``` + +### Output Example + +While running, `sortgs` will provide updates in the terminal: -Example of output while running: ``` +❯ sortgs "'machine learning'" +Running with the following parameters: +Keyword: 'machine learning', Number of results: 100, Save database: True, Path: /Users/wittmann/sort-google-scholar, Sort by: Citations, Plot results: False, Start year: None, End year: 2023, Debug: False Loading next 10 results -Robot checking detected, handling with selenium (if installed) -Loading... -Solve captcha manually and press enter here to continue... -year not found, appending 0 Loading next 20 results -Robot checking detected, handling with selenium (if installed) -Loading next 30 results -Robot checking detected, handling with selenium (if installed) -Loading next 40 results +... ``` -## Installation -SortGS is not available (yet) on PyPa. The most straight foward way to use it is the following: +## Step-by-Step Installation 1. Install Python 3 and its dependencies from **Requirements** (suggestion: use Ananconda https://www.anaconda.com/distribution/) -2. Download the repository. Two ways to do this: - - Use the command `git clone https://github.com/WittmannF/sort-google-scholar.git` in your terminal (if linux/MAC) or CMD (if windows) - - Or download using this link: https://github.com/WittmannF/sort-google-scholar/archive/master.zip and unzip -3. Open the folder of sortgs on your terminal (if linux/MAC) or CMD (if windows) -4. Use the command `python sortgs.py --kw "your keyword"` (replace "your keyword" to any keyword that you'd like to search) -5. A CSV file with the name `your_keyword.csv` should be created. +2. In the terminal (or cmd if using Windows), run `pip install sortgs` +3. Use the command `sortgs "your keyword"` (replace "your keyword" to any keyword that you'd like to search) +4. A CSV file with the name `your_keyword.csv` should be created. If those steps are too complicated for you, send me an email with a list of keyworks that you'd like them ranked to: fernando [dot] wittmann [at] gmail [dot] com -## Requirements -If you install anaconda, all of those requirements (except selenium) are going to be met: -- Python 2.7 or Python 3 -- Install from the requirements file: `pip install -r requirements.txt` - -Highly suggested, if having problems with robot checking: -- ChromeDriver: http://chromedriver.chromium.org/ - - After downloading chromedriver, rename it to `chromedriver` and add it in a folder accessible by the PATH (Example: your python directory. Mine is at `/Users/.../anaconda/bin/`) - ## Running Project Using Docker This guide will walk you through the process of installing Docker, pulling the `fernandowittmann/sort-google-scholar` Docker image, and running the project. @@ -165,20 +162,11 @@ This guide will walk you through the process of installing Docker, pulling the ` ## Contributing -In order to make contributions, all of the tests must be passed. In order to test the code, we will be using the DEBUG mode which is going to use a URL from web archive. Please make sure to save the URL you want to test on web archive in case it is different from the one I already saved. By default it only works in debug mode when using the keywords 'machine learning'. There are 6 tests and all of them are testing different aspects that should match when using SortGS. In order to run the test cases, just run: +Just run: ``` $python -m unittest ``` +And check if all tests passes. Alternativelly send a PR, github actions will run the tests for you. ## LICENSE - MIT - - -### Citation -This code was originally developed for my [MS Dissertation](http://repositorio.unicamp.br/jspui/handle/REPOSIP/330610). For referencing this tool, you can use the following: - -``` -WITTMANN, Fernando Marcos. Optimization applied to residential non-intrusive load monitoring. 2017. -Dissertation (Masters) - University of Campinas, School of Electrical and Computer Engineering, Campinas, SP. -Available in: . -``` diff --git a/Test_sortgs_py_on_Colab.ipynb b/Test_sortgs_py_on_Colab.ipynb deleted file mode 100644 index 8431e9b..0000000 --- a/Test_sortgs_py_on_Colab.ipynb +++ /dev/null @@ -1,429 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "Test sortgs.py on Colab.ipynb", - "provenance": [], - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "M36VFanosbkb" - }, - "source": [ - "## Try `sortgs.py` on Google Colab\n", - "This is a jupyter envirnment where you can try the code of the repository without installing anything. The only limitation is the robot checking problem which would require selenium and manual solution of the captchas, but for trying a few keywords, it should work! \n", - "\n", - "> **INSTRUCTIONS:** If this is the first time you are using a jupyter environment, you simply have to run the code blocks using the keyword `SHIFT` + `ENTER`. Make sure to update the keyword parameters when required. \n", - "\n", - "First, let's clone the repository:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "oPot8aWcsfei" - }, - "source": [ - "!git clone https://github.com/WittmannF/sort-google-scholar.git" - ], - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pM5XMRmVspR7" - }, - "source": [ - "Now, let's open the folder from the cloned repository:" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "LQ0mCxVNrlCB", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "outputId": "4501af7d-39d8-497d-af7b-2632f2fc856b" - }, - "source": [ - "cd sort-google-scholar/" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "/content/sort-google-scholar\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KALGyCEJsvTL" - }, - "source": [ - "Next, let's run the code. Make sure to change \"deep learning\" to the keyword that you would like to have it ranked." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "dohZcNUmrost", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 504 - }, - "outputId": "6c61226a-8ab8-4609-8fac-5127c4e48d9f" - }, - "source": [ - "# Change 'deep learning' with the keyword that you would like to check\n", - "!python sortgs.py --kw \"deep learning\" --sortby \"cit/year\"" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Loading next 10 results\n", - "sortgs.py:239: UserWarning: Year not found for Could not catch title, appending 0\n", - " warnings.warn(\"Year not found for {}, appending 0\".format(title[-1]))\n", - "Loading next 20 results\n", - "Loading next 30 results\n", - "Loading next 40 results\n", - "Loading next 50 results\n", - "Loading next 60 results\n", - "Loading next 70 results\n", - "Loading next 80 results\n", - "Loading next 90 results\n", - "Loading next 100 results\n", - "Column name to be sorted not found. Sorting by the number of citations...\n", - "'cit/year'\n", - " Author ... cit/year\n", - "Rank ... \n", - "1 LeCun, Y Bengio, G Hinton ... 3846\n", - "3 Goodfellow, Y Bengio, A Courville ... 2616\n", - "9 Schmidhuber ... 1360\n", - "4 Mnih, K Kavukcuoglu, D Silver, A Graves… ... 421\n", - "41 Litjens, T Kooi, BE Bejnordi, AAA Setio, F Cio... ... 689\n", - "... ... ... ...\n", - "34 Author not found ... 0\n", - "23 Author not found ... 0\n", - "12 Author not found ... 0\n", - "5 Author not found ... 0\n", - "111 Author not found ... 0\n", - "\n", - "[111 rows x 6 columns]\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "s_nuxpy_s_9c" - }, - "source": [ - "> _**NOTE:** It is normal to get some warnings, for example year not found or author not found. However, if you get the robot checking warning, then it might not work anymore in the IP that you have on Google Colab. You can try going in 'Runtime' > 'Disconnect and delete runtime' to get a new IP. If the problem persists, then you will have to run locally using selenium and solve the captchas manually. Make sure to avoid running this code too often to avoid the robot checking problem._\n", - "\n", - "Next, you will see that a csv file with the name of the keyword was created (which is `deep_learning.csv` in my case). " - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "94792EoBrrBU", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "outputId": "c8e256c2-b7df-4c93-94f2-14d71a7f8050" - }, - "source": [ - "ls" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "text": [ - "deep_learning.csv \u001b[0m\u001b[01;34mexamples\u001b[0m/ README.md \u001b[01;34msort-google-scholar-V1\u001b[0m/ sortgs.py\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "QQIb9oYou9GM" - }, - "source": [ - "Let's import this file to visualize some results (make sure to change `deep_learning.csv` to the file name that was created in your case):" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "NVoHI4zTr5pB" - }, - "source": [ - "import pandas as pd\n", - "df = pd.read_csv('deep_learning.csv') # OBS: Update the file name" - ], - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "S1NzeUq0sOu-", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 578 - }, - "outputId": "29bdad8a-17e1-415d-a2e3-827cfe71889a" - }, - "source": [ - "df.head(10)" - ], - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RankAuthorTitleCitationsYearSourcecit/year
01LeCun, Y Bengio, G HintonDeep learning192322015https://www.nature.com/articles/nature145393846
13Goodfellow, Y Bengio, A CourvilleDeep learning104662016https://books.google.com/books?hl=en&lr=&id=om...2616
29SchmidhuberDeep learning in neural networks: An overview67992015https://www.sciencedirect.com/science/article/...1360
34Mnih, K Kavukcuoglu, D Silver, A Graves…Playing atari with deep reinforcement learning29492013https://arxiv.org/abs/1312.5602421
441Litjens, T Kooi, BE Bejnordi, AAA Setio, F Cio...A survey on deep learning in medical image ana...20672017https://www.sciencedirect.com/science/article/...689
524Sutskever, J Martens, G Dahl, G HintonOn the importance of initialization and moment...20312013http://www.jmlr.org/proceedings/papers/v28/sut...290
66Deng, D YuDeep learning: methods and applications18842014http://www.nowpublishers.com/article/Details/S...314
727Erhan, Y Bengio, A Courville, PA Manzagol…Why does unsupervised pre-training help deep l...18572010http://www.jmlr.org/papers/v11/erhan10a.html186
82Ngiam, A Khosla, M Kim, J Nam, H Lee…Multimodal deep learning17852011http://ai.stanford.edu/~ang/papers/icml11-Mult...198
920Dong, CC Loy, K He, X TangLearning a deep convolutional network for imag...17342014https://link.springer.com/chapter/10.1007/978-...289
\n", - "
" - ], - "text/plain": [ - " Rank ... cit/year\n", - "0 1 ... 3846\n", - "1 3 ... 2616\n", - "2 9 ... 1360\n", - "3 4 ... 421\n", - "4 41 ... 689\n", - "5 24 ... 290\n", - "6 6 ... 314\n", - "7 27 ... 186\n", - "8 2 ... 198\n", - "9 20 ... 289\n", - "\n", - "[10 rows x 7 columns]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 9 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "t7ZCDWaksZxj" - }, - "source": [ - "Above we have the top 10 papers of deep learning ranked by citations per year. It is incredible that some papers are very far away from the original rank. For example, the fourth most cited paper per year is originally the number 41 in the original rank of Google! " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-xx5GEHuybPd" - }, - "source": [ - "Finally, let's download the CSV results (make sure to update the CSV name here as well):" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Svc1GCM2yaLP" - }, - "source": [ - "from google.colab import files\n", - "files.download('deep_learning.csv') # Update the file name here" - ], - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "09OFwDdM2K5h" - }, - "source": [ - "OBS: If you get an error running the previous line, you can download the file manually by clicking in the left pane icon (below the `+ Code` button), then click in files, expand the `sort-google-scholar` folder, right click and download in the csv file:\n", - "\n", - "![](https://i.stack.imgur.com/KKJXFm.png)" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "pM_Bb4MH14eI" - }, - "source": [ - "" - ], - "execution_count": null, - "outputs": [] - } - ] -} \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..81cc3d8 --- /dev/null +++ b/setup.py @@ -0,0 +1,27 @@ +from setuptools import setup + +setup( + name='sortgs', + version='1.0.3', + author='Fernando Marcos Wittmann', + #author_email='fernando.wittmann[at]gmail[dot]com', + description='A Python tool to rank Google Scholar publications by citations.', + long_description=open('README.md').read(), + long_description_content_type='text/markdown', + url='https://github.com/WittmannF/sort-google-scholar', + py_modules=['sortgs'], # Assuming your script is named sortgs.py + install_requires=[ + # your dependencies here + ], + entry_points={ + 'console_scripts': [ + 'sortgs=sortgs:main', # This line sets up the command line tool + ], + }, + classifiers=[ + 'Programming Language :: Python :: 3', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + ], + python_requires='>=3.6', +) diff --git a/sort-google-scholar-V1/Example-Python27.ipynb b/sort-google-scholar-V1/Example-Python27.ipynb deleted file mode 100644 index 09a459b..0000000 --- a/sort-google-scholar-V1/Example-Python27.ipynb +++ /dev/null @@ -1,1735 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This code creates a database with a list of publications data from Google \n", - "Scholar.\n", - "The data acquired from GS is Title, Citations, Links and Rank.\n", - "It is useful for finding relevant papers by sorting by the number of citations\n", - "This example will look for the top 100 papers related to the keyword \n", - "'non intrusive load monitoring', so that you can rank them by the number of citations\n", - "\n", - "As output this program will plot the number of citations in the Y axis and the \n", - "rank of the result in the X axis. It also, optionally, export the database to\n", - "a .csv file.\n", - "\n", - "Before using it, please update the initial variables" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Update these variables according to your requirement\n", - "keyword = \"'adaptative filtering'\" # the double quote will look for the exact keyword,\n", - " # the simple quote will also look for similar keywords\n", - "number_of_results = 100 # number of results to look for on Google Scholar\n", - "save_database = False # choose if you would like to save the database to .csv (recommended to correctly visualize the URLs)\n", - "path = 'C:/results_sorting.csv' # path to save the data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Main code for searching and sorting the results" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Done!\n" - ] - } - ], - "source": [ - "# -*- coding: utf-8 -*-\n", - "import requests\n", - "from bs4 import BeautifulSoup\n", - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "\n", - "\n", - "def get_citations(content):\n", - " out = 0\n", - " for char in range(0,len(content)):\n", - " if content[char:char+9] == 'Cited by ':\n", - " init = char+9 \n", - " for end in range(init+1,init+6):\n", - " if content[end] == '<':\n", - " break\n", - " out = content[init:end]\n", - " return int(out)\n", - " \n", - "def get_year(content):\n", - " for char in range(0,len(content)):\n", - " if content[char] == '-':\n", - " out = content[char-5:char-1]\n", - " if not out.isdigit():\n", - " out = 0\n", - " return int(out)\n", - "\n", - "def get_author(content):\n", - " for char in range(0,len(content)):\n", - " if content[char] == '-':\n", - " out = content[2:char-1]\n", - " break\n", - " return out\n", - "\n", - "# Start new session\n", - "session = requests.Session()\n", - "\n", - "# Variables\n", - "links = list()\n", - "title = list()\n", - "citations = list()\n", - "year = list()\n", - "rank = list()\n", - "author = list()\n", - "rank.append(0) # initialization necessary for incremental purposes\n", - "\n", - "# Get content \n", - "for n in range(0, number_of_results, 10): \n", - " url = 'https://scholar.google.com/scholar?start='+str(n)+'&q='+keyword.replace(' ','+')\n", - " page = session.get(url)\n", - " c = page.content\n", - " \n", - " # Create parser\n", - " soup = BeautifulSoup(c, 'html.parser')\n", - " \n", - " # Get stuff\n", - " mydivs = soup.findAll(\"div\", { \"class\" : \"gs_r\" })\n", - " \n", - " for div in mydivs:\n", - " try:\n", - " links.append(div.find('h3').find('a').get('href'))\n", - " except: # catch *all* exceptions\n", - " links.append('Look manually at: https://scholar.google.com/scholar?start='+str(n)+'&q'+keyword.replace(' ','+'))\n", - " \n", - " try:\n", - " title.append(div.find('h3').find('a').text)\n", - " except: \n", - " title.append('Could not catch title')\n", - " \n", - " citations.append(get_citations(str(div.format_string)))\n", - " year.append(get_year(div.find('div',{'class' : 'gs_a'}).text))\n", - " author.append(get_author(div.find('div',{'class' : 'gs_a'}).text))\n", - " rank.append(rank[-1]+1)\n", - "\n", - "# Create a dataset and sort by the number of citations\n", - "data = pd.DataFrame(zip(author, title, citations, year, links), index = rank[1:], \n", - " columns=['Author', 'Title', 'Citations', 'Year', 'Source'])\n", - "data = data.rename_axis('Rank', axis=\"columns\")\n", - "\n", - "data_ranked = data.sort_values('Citations', ascending=False)\n", - "\n", - "# Save results\n", - "if save_database:\n", - " data_ranked.to_csv(path, encoding='utf-8')\n", - "\n", - "print('Done!')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, let's visualize the top 100 papers sorted by the number of citations. Note that the first column is the Rank in which the result was on Google Scholar. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RankAuthorTitleCitationsYearSource
88ProakisCompanders472082001http://onlinelibrary.wiley.com/doi/10.1002/047...
1HaykinCould not catch title230072008Look manually at: https://scholar.google.com/s...
64R JangANFIS: adaptive-network-based fuzzy inference ...122061993http://ieeexplore.ieee.org/abstract/document/2...
60Kalman, RS BucyNew results in linear filtering and prediction...64181961https://fluidsengineering.asmedigitalcollectio...
2Goodwin, KS SinAdaptive filtering prediction and control54642014https://books.google.com/books?hl=en&lr=&id=0_...
62Widrow, JR Glover, JM McCool…Adaptive noise cancelling: Principles and appl...44341975http://ieeexplore.ieee.org/abstract/document/1...
77Van Veen, KM BuckleyBeamforming: A versatile approach to spatial f...34141988http://ieeexplore.ieee.org/abstract/document/665/
80Chang, B Yu, M VetterliAdaptive wavelet thresholding for image denois...27432000http://ieeexplore.ieee.org/abstract/document/8...
47FrostAn algorithm for linearly constrained adaptive...24921972http://ieeexplore.ieee.org/abstract/document/1...
98P Blom, Y BaThe interacting multiple model algorithm for s...22861988http://ieeexplore.ieee.org/abstract/document/1...
28BlackmanMultiple-target tracking with radar applications21761986http://adsabs.harvard.edu/abs/1986ah...bookQ....B
35Griffiths, CW JimAn alternative approach to linearly constraine...20231982http://ieeexplore.ieee.org/abstract/document/1...
10SayedFundamentals of adaptive filtering19072003https://books.google.com/books?hl=en&lr=&id=Va...
100Moon, WC StirlingCould not catch title17532000Look manually at: https://scholar.google.com/s...
50HaykinKalman filtering and neural networks17172001http://onlinelibrary.wiley.com/doi/10.1002/047...
6Widrow, JM McCool, MG Larimore…Stationary and nonstationary learning characte...16831976http://ieeexplore.ieee.org/abstract/document/1...
5Frost, JA Stiles, KS Shanmugan…A model for radar images and its application t...16691982http://ieeexplore.ieee.org/abstract/document/4...
75Widrow, PE Mantey, LJ Griffiths…Adaptive antenna systems16541967http://ieeexplore.ieee.org/abstract/document/1...
38WardSpace-time adaptive processing for airborne radar14541998http://digital-library.theiet.org/content/conf...
19Nummiaro, E KolleAn adaptive color-based particle filter13942003http://www.sciencedirect.com/science/article/p...
4Manolakis, VK Ingle, SM KogonStatistical and adaptive signal processing: sp...13912005https://pdfs.semanticscholar.org/e4fa/b1d57597...
7Kuan, AA Sawchuk, TC Strand…Adaptive noise smoothing filter for images wit...13531985http://ieeexplore.ieee.org/abstract/document/4...
90Ko, YH LeeCenter weighted median filters and their appli...12881991http://ieeexplore.ieee.org/abstract/document/8...
16R DinizAdaptive filtering12861997http://link.springer.com/content/pdf/10.1007/9...
11MehraOn the identification of variances and adaptiv...11641970http://ieeexplore.ieee.org/abstract/document/1...
53Kumar, P VaraiyaStochastic systems: Estimation, identification...11162015http://epubs.siam.org/doi/pdf/10.1137/1.978161...
40Bishop, BJ Etherton…Adaptive sampling with the ensemble transform ...10922001http://journals.ametsoc.org/doi/abs/10.1175/15...
21Gustafsson, F GustafssonAdaptive filtering and change detection10902000http://citeseerx.ist.psu.edu/viewdoc/download?...
27FarhanAdaptive filters: theory and applications10892013https://books.google.com/books?hl=en&lr=&id=Fm...
8Hwang, RA HaddadAdaptive median filters: new algorithms and re...10241995http://ieeexplore.ieee.org/abstract/document/3...
..................
45Clark, S Mitra, S ParkerBlock implementation of adaptive digital filters4871981http://ieeexplore.ieee.org/abstract/document/1...
68Breining, P Dreiscitel, E Hansler…Acoustic echo control. An application of very-...4861999http://ieeexplore.ieee.org/abstract/document/7...
18N Cowan, PM GrantCould not catch title4750Look manually at: https://scholar.google.com/s...
57Zhang, J Callan, T MinkaNovelty and redundancy detection in adaptive f...4652002http://dl.acm.org/citation.cfm?id=564393
59Mathews, Z XieA stochastic gradient adaptive filter with gra...4631993http://ieeexplore.ieee.org/abstract/document/2...
78RegaliaAdaptive IIR filtering in signal processing an...4621994https://books.google.com/books?hl=en&lr=&id=B6...
74AlkuGlottal wave analysis with pitch synchronous i...4551992http://www.sciencedirect.com/science/article/p...
58Harris, D Chabries, F BishopA variable step (VS) adaptive filter algorithm4461986http://ieeexplore.ieee.org/abstract/document/1...
81Treichler, CR Johnson Jr, MJ LarimoreTheory and design of adaptive filters4411987http://dl.acm.org/citation.cfm?id=SERIES10554....
54Hoshuyama, A Sugiyama…A robust adaptive beamformer for microphone ar...4381999http://ieeexplore.ieee.org/abstract/document/7...
83AndersonNumerical integration of related Hankel transf...4291979http://library.seg.org/doi/abs/10.1190/1.1441007
55Kellman, FH Epstein…Adaptive sensitivity encoding incorporating te...4252001http://onlinelibrary.wiley.com/doi/10.1002/mrm...
65Eleftheriou, D FalconerTracking properties and steady-state performan...4151986http://ieeexplore.ieee.org/abstract/document/1...
79FoxKLD-sampling: Adaptive particle filters4012001https://papers.nips.cc/paper/1998-kld-sampling...
99Widrow, M BilelloAdaptive inverse control3961993http://ieeexplore.ieee.org/abstract/document/3...
63Xue, YH Hu, WJ TompkinsNeural-network-based adaptive matched filterin...3951992http://ieeexplore.ieee.org/abstract/document/1...
49ZelinskiA microphone array with adaptive post-filterin...3941988http://ieeexplore.ieee.org/abstract/document/1...
66Li, P StoicaAn adaptive filtering approach to spectral est...3801996http://ieeexplore.ieee.org/abstract/document/5...
85BellangerAdaptive digital filters3802001https://books.google.com/books?hl=en&lr=&id=l3...
69FujitaAdaptive filter model of the cerebellum3731982http://link.springer.com/article/10.1007/BF003...
70Meylan, S SusstrunkHigh dynamic range image rendering with a reti...3672006http://ieeexplore.ieee.org/abstract/document/1...
94FeintuchAn adaptive recursive LMS filter3661976http://ieeexplore.ieee.org/abstract/document/1...
89M Slock, T KailathNumerically stable fast transversal filters fo...3421991http://ieeexplore.ieee.org/abstract/document/8...
84Glentis, K Berberidis…Efficient least squares adaptive algorithms fo...3311999http://ieeexplore.ieee.org/abstract/document/7...
61MacchiAdaptative Processing: the Least Mean Squares ...2631995http://www.sidalc.net/cgi-bin/wxis.exe/?IsisSc...
76Bogey, N De Cacqueray, C BaillyA shock-capturing methodology based on adaptat...1552009http://www.sciencedirect.com/science/article/p...
95Macchi, E EwedaSecond-order convergence analysis of stochasti...1371983http://ieeexplore.ieee.org/abstract/document/1...
96PomalazAn adaptative, nonlinear edge-preserving filter1351984http://ieeexplore.ieee.org/abstract/document/1...
3SamyAn adaptative image sequence filtering scheme ...241986http://proceedings.spiedigitallibrary.org/proc...
51OlivoAutomatic detection of spots in biological ima...221996http://ieeexplore.ieee.org/abstract/document/5...
\n", - "

100 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - "Rank Author \\\n", - "88 Proakis \n", - "1 Haykin \n", - "64 R Jang \n", - "60 Kalman, RS Bucy \n", - "2 Goodwin, KS Sin \n", - "62 Widrow, JR Glover, JM McCool… \n", - "77 Van Veen, KM Buckley \n", - "80 Chang, B Yu, M Vetterli \n", - "47 Frost \n", - "98 P Blom, Y Ba \n", - "28 Blackman \n", - "35 Griffiths, CW Jim \n", - "10 Sayed \n", - "100 Moon, WC Stirling \n", - "50 Haykin \n", - "6 Widrow, JM McCool, MG Larimore… \n", - "5 Frost, JA Stiles, KS Shanmugan… \n", - "75 Widrow, PE Mantey, LJ Griffiths… \n", - "38 Ward \n", - "19 Nummiaro, E Kolle \n", - "4 Manolakis, VK Ingle, SM Kogon \n", - "7 Kuan, AA Sawchuk, TC Strand… \n", - "90 Ko, YH Lee \n", - "16 R Diniz \n", - "11 Mehra \n", - "53 Kumar, P Varaiya \n", - "40 Bishop, BJ Etherton… \n", - "21 Gustafsson, F Gustafsson \n", - "27 Farhan \n", - "8 Hwang, RA Haddad \n", - ".. ... \n", - "45 Clark, S Mitra, S Parker \n", - "68 Breining, P Dreiscitel, E Hansler… \n", - "18 N Cowan, PM Grant \n", - "57 Zhang, J Callan, T Minka \n", - "59 Mathews, Z Xie \n", - "78 Regalia \n", - "74 Alku \n", - "58 Harris, D Chabries, F Bishop \n", - "81 Treichler, CR Johnson Jr, MJ Larimore \n", - "54 Hoshuyama, A Sugiyama… \n", - "83 Anderson \n", - "55 Kellman, FH Epstein… \n", - "65 Eleftheriou, D Falconer \n", - "79 Fox \n", - "99 Widrow, M Bilello \n", - "63 Xue, YH Hu, WJ Tompkins \n", - "49 Zelinski \n", - "66 Li, P Stoica \n", - "85 Bellanger \n", - "69 Fujita \n", - "70 Meylan, S Susstrunk \n", - "94 Feintuch \n", - "89 M Slock, T Kailath \n", - "84 Glentis, K Berberidis… \n", - "61 Macchi \n", - "76 Bogey, N De Cacqueray, C Bailly \n", - "95 Macchi, E Eweda \n", - "96 Pomalaz \n", - "3 Samy \n", - "51 Olivo \n", - "\n", - "Rank Title Citations Year \\\n", - "88 Companders 47208 2001 \n", - "1 Could not catch title 23007 2008 \n", - "64 ANFIS: adaptive-network-based fuzzy inference ... 12206 1993 \n", - "60 New results in linear filtering and prediction... 6418 1961 \n", - "2 Adaptive filtering prediction and control 5464 2014 \n", - "62 Adaptive noise cancelling: Principles and appl... 4434 1975 \n", - "77 Beamforming: A versatile approach to spatial f... 3414 1988 \n", - "80 Adaptive wavelet thresholding for image denois... 2743 2000 \n", - "47 An algorithm for linearly constrained adaptive... 2492 1972 \n", - "98 The interacting multiple model algorithm for s... 2286 1988 \n", - "28 Multiple-target tracking with radar applications 2176 1986 \n", - "35 An alternative approach to linearly constraine... 2023 1982 \n", - "10 Fundamentals of adaptive filtering 1907 2003 \n", - "100 Could not catch title 1753 2000 \n", - "50 Kalman filtering and neural networks 1717 2001 \n", - "6 Stationary and nonstationary learning characte... 1683 1976 \n", - "5 A model for radar images and its application t... 1669 1982 \n", - "75 Adaptive antenna systems 1654 1967 \n", - "38 Space-time adaptive processing for airborne radar 1454 1998 \n", - "19 An adaptive color-based particle filter 1394 2003 \n", - "4 Statistical and adaptive signal processing: sp... 1391 2005 \n", - "7 Adaptive noise smoothing filter for images wit... 1353 1985 \n", - "90 Center weighted median filters and their appli... 1288 1991 \n", - "16 Adaptive filtering 1286 1997 \n", - "11 On the identification of variances and adaptiv... 1164 1970 \n", - "53 Stochastic systems: Estimation, identification... 1116 2015 \n", - "40 Adaptive sampling with the ensemble transform ... 1092 2001 \n", - "21 Adaptive filtering and change detection 1090 2000 \n", - "27 Adaptive filters: theory and applications 1089 2013 \n", - "8 Adaptive median filters: new algorithms and re... 1024 1995 \n", - ".. ... ... ... \n", - "45 Block implementation of adaptive digital filters 487 1981 \n", - "68 Acoustic echo control. An application of very-... 486 1999 \n", - "18 Could not catch title 475 0 \n", - "57 Novelty and redundancy detection in adaptive f... 465 2002 \n", - "59 A stochastic gradient adaptive filter with gra... 463 1993 \n", - "78 Adaptive IIR filtering in signal processing an... 462 1994 \n", - "74 Glottal wave analysis with pitch synchronous i... 455 1992 \n", - "58 A variable step (VS) adaptive filter algorithm 446 1986 \n", - "81 Theory and design of adaptive filters 441 1987 \n", - "54 A robust adaptive beamformer for microphone ar... 438 1999 \n", - "83 Numerical integration of related Hankel transf... 429 1979 \n", - "55 Adaptive sensitivity encoding incorporating te... 425 2001 \n", - "65 Tracking properties and steady-state performan... 415 1986 \n", - "79 KLD-sampling: Adaptive particle filters 401 2001 \n", - "99 Adaptive inverse control 396 1993 \n", - "63 Neural-network-based adaptive matched filterin... 395 1992 \n", - "49 A microphone array with adaptive post-filterin... 394 1988 \n", - "66 An adaptive filtering approach to spectral est... 380 1996 \n", - "85 Adaptive digital filters 380 2001 \n", - "69 Adaptive filter model of the cerebellum 373 1982 \n", - "70 High dynamic range image rendering with a reti... 367 2006 \n", - "94 An adaptive recursive LMS filter 366 1976 \n", - "89 Numerically stable fast transversal filters fo... 342 1991 \n", - "84 Efficient least squares adaptive algorithms fo... 331 1999 \n", - "61 Adaptative Processing: the Least Mean Squares ... 263 1995 \n", - "76 A shock-capturing methodology based on adaptat... 155 2009 \n", - "95 Second-order convergence analysis of stochasti... 137 1983 \n", - "96 An adaptative, nonlinear edge-preserving filter 135 1984 \n", - "3 An adaptative image sequence filtering scheme ... 24 1986 \n", - "51 Automatic detection of spots in biological ima... 22 1996 \n", - "\n", - "Rank Source \n", - "88 http://onlinelibrary.wiley.com/doi/10.1002/047... \n", - "1 Look manually at: https://scholar.google.com/s... \n", - "64 http://ieeexplore.ieee.org/abstract/document/2... \n", - "60 https://fluidsengineering.asmedigitalcollectio... \n", - "2 https://books.google.com/books?hl=en&lr=&id=0_... \n", - "62 http://ieeexplore.ieee.org/abstract/document/1... \n", - "77 http://ieeexplore.ieee.org/abstract/document/665/ \n", - "80 http://ieeexplore.ieee.org/abstract/document/8... \n", - "47 http://ieeexplore.ieee.org/abstract/document/1... \n", - "98 http://ieeexplore.ieee.org/abstract/document/1... \n", - "28 http://adsabs.harvard.edu/abs/1986ah...bookQ....B \n", - "35 http://ieeexplore.ieee.org/abstract/document/1... \n", - "10 https://books.google.com/books?hl=en&lr=&id=Va... \n", - "100 Look manually at: https://scholar.google.com/s... \n", - "50 http://onlinelibrary.wiley.com/doi/10.1002/047... \n", - "6 http://ieeexplore.ieee.org/abstract/document/1... \n", - "5 http://ieeexplore.ieee.org/abstract/document/4... \n", - "75 http://ieeexplore.ieee.org/abstract/document/1... \n", - "38 http://digital-library.theiet.org/content/conf... \n", - "19 http://www.sciencedirect.com/science/article/p... \n", - "4 https://pdfs.semanticscholar.org/e4fa/b1d57597... \n", - "7 http://ieeexplore.ieee.org/abstract/document/4... \n", - "90 http://ieeexplore.ieee.org/abstract/document/8... \n", - "16 http://link.springer.com/content/pdf/10.1007/9... \n", - "11 http://ieeexplore.ieee.org/abstract/document/1... \n", - "53 http://epubs.siam.org/doi/pdf/10.1137/1.978161... \n", - "40 http://journals.ametsoc.org/doi/abs/10.1175/15... \n", - "21 http://citeseerx.ist.psu.edu/viewdoc/download?... \n", - "27 https://books.google.com/books?hl=en&lr=&id=Fm... \n", - "8 http://ieeexplore.ieee.org/abstract/document/3... \n", - ".. ... \n", - "45 http://ieeexplore.ieee.org/abstract/document/1... \n", - "68 http://ieeexplore.ieee.org/abstract/document/7... \n", - "18 Look manually at: https://scholar.google.com/s... \n", - "57 http://dl.acm.org/citation.cfm?id=564393 \n", - "59 http://ieeexplore.ieee.org/abstract/document/2... \n", - "78 https://books.google.com/books?hl=en&lr=&id=B6... \n", - "74 http://www.sciencedirect.com/science/article/p... \n", - "58 http://ieeexplore.ieee.org/abstract/document/1... \n", - "81 http://dl.acm.org/citation.cfm?id=SERIES10554.... \n", - "54 http://ieeexplore.ieee.org/abstract/document/7... \n", - "83 http://library.seg.org/doi/abs/10.1190/1.1441007 \n", - "55 http://onlinelibrary.wiley.com/doi/10.1002/mrm... \n", - "65 http://ieeexplore.ieee.org/abstract/document/1... \n", - "79 https://papers.nips.cc/paper/1998-kld-sampling... \n", - "99 http://ieeexplore.ieee.org/abstract/document/3... \n", - "63 http://ieeexplore.ieee.org/abstract/document/1... \n", - "49 http://ieeexplore.ieee.org/abstract/document/1... \n", - "66 http://ieeexplore.ieee.org/abstract/document/5... \n", - "85 https://books.google.com/books?hl=en&lr=&id=l3... \n", - "69 http://link.springer.com/article/10.1007/BF003... \n", - "70 http://ieeexplore.ieee.org/abstract/document/1... \n", - "94 http://ieeexplore.ieee.org/abstract/document/1... \n", - "89 http://ieeexplore.ieee.org/abstract/document/8... \n", - "84 http://ieeexplore.ieee.org/abstract/document/7... \n", - "61 http://www.sidalc.net/cgi-bin/wxis.exe/?IsisSc... \n", - "76 http://www.sciencedirect.com/science/article/p... \n", - "95 http://ieeexplore.ieee.org/abstract/document/1... \n", - "96 http://ieeexplore.ieee.org/abstract/document/1... \n", - "3 http://proceedings.spiedigitallibrary.org/proc... \n", - "51 http://ieeexplore.ieee.org/abstract/document/5... \n", - "\n", - "[100 rows x 5 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_ranked" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Position of these results on Google Scholar" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAGHCAYAAABSw0P1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xm8HFWZ//HPNwshAXNBszqKgoEYN+AGWURwQQirojhq\n0AEk6LBlIA4/RIYAwiDLDAQDMcMQEAWJLA5EQQibC5sgN6ggi7IJggSQEEJAstzn98ephrqd7nu7\n+/a93bfzfb9e/Uq66lTVU9V9u546dc4pRQRmZmZmrWZQowMwMzMz6wtOcszMzKwlOckxMzOzluQk\nx8zMzFqSkxwzMzNrSU5yzMzMrCU5yTEzM7OW5CTHzMzMWpKTHDMzM2tJTnLM1nKSnpB0YaPjKJB0\nkaTHGx1HrSR9TFKnpB0bsO0Jkm6Q9JKk1ZI+LWn/LJ6NcuV+KemWfozrREmd/bU9swInObbWyf3o\ntxdNHynpbkmvStqlUfE1QM3Pdsmd0DfquXRV8fTp82YkbSfpBEkje7GOQyTtX2Z2o56X80Pg/cCx\nwL8A95SJp8t7SeOz4/GhPoorgD5PciQ9Lun4vt6ODRxOcmxtVfwj/xbgRuADwN4RcUNDohqYBuID\n8D4CHA9s0It1HAqskeRExK+A4RHx616su2qS1gW2BeZFxPci4tKIeIaU+AyPiCe7WfztwAnAFn0U\n3snAiD5at1lZTnJsrSdpfeAG4EPA51otwZE0vNExNCH15cojYkVfrr+MMdm/S4tiiQri6ZPjIWlE\nFkNng46JreWc5NhaTdJ6wELSFeznIuL6EmUmSrpS0t8lvSbpt5L2ys3fOLtlc0SJZT+SzfuipA9m\n/98zN789m3ZP0XLXSbqzaNqhku6X9A9JT0s6V1JbUZlfSvpDtt5fS1oOnJKbf5ykpyQtl3SzpPeV\nOS6bSNqkp+NXKF607EclXS7pL1msT0o6K6tpKN7O3tk+vZbFvXeZeI6SdLukF7LbifdI2qdEuU5J\nsyXtK+mhbL33SNohV+YE4Izs7RPZMqsLt9wkfTU7Nouz+P8o6eCi7TxOui308Wz5zkIbl+I2OZLO\nkbSszP7Pl/SMJOWm7ZZ9dq9IelnSNeU+p6J9eoJUq/bf2fYfy+Yd0N0tRUkfA+7Olr0odzz2y5XZ\nRtL1Sm19lmffs48UrefEbNlJki6V9CJwa35eUfnCZ/UZSfdlx/p+SVNKxPjx7HN8TdKfJX291DrN\nig1pdABmDbQ+cD0wGdgnIq4rLiDp/cBtwF+BU4HlwBeAqyV9LiIWRMTjkm4Hvgx8t2gVXwZeBq4G\nVgAvATsC12TzdyC1Vdhc0voR8Up2wtsO+J9cHCeSbq/cAHwPmEi6XbKVpO0jYnVWNIBRwM+BH5Nu\nVSzO1nEy8B/Ztq8D2rP1DS1xbG7J4qok0Sm+XfXPwPAszr8DWwPTgX8Cvpjbp12AK4H7gWOAtwHf\nJx3rYv8GLAAuAdYBvgRcLmnPEp/bx7PtzAZeJx2n6yRtHREPAD8BNsvWcUQWI8Dz2b8HZzEtAFYB\newHfk6SImJuVOQI4F1gG/Ccp0Vtc5phclsWwR7btwv4PB/YELoyIyKb9C3AR6Xt5NOkWzyHArZK2\n7OaW00+AJcDZwKWkz/+VXCzd3VJ8kPTdOgk4jywxAe7IYvpktr57gBNJ34uvArdI+mhEFLf7uQL4\nE/At3kyAy8WwA/A50ndlGelzvlLSRhGxJNv+lqTv6zPATNJ5aybwQol1DsRbp9aXIsIvv9aqF6kd\nRSfwOPAPYM9uyt4E3AsMKZp+G/BQ7v3XgNXAZrlpQ4DngAty034G3Jl7fyXppLAC2CWbtmUW357Z\n+1FZnD8viuHQbJv756b9Ipt2UFHZwjoWFE3/z2xbFxZNfxx4tMbjO6zEtG+SEoZ35KbdS0po1s9N\n2ymL57Hu1gkMBv4A3Fg0vTPb/y1y094JvApcmZv271m5jSqM/zrgz0XT7gNuKVH2Y9m6d8xNewq4\nvKjcP2flts/erwe8CMwtKjealMD8Tw/H/V3Z/n+jxPe9y75m35Nbcu8nZ8vuV2K9DwPXFh8j4FHg\n+ty0E7J1XFxiHScAq0t8Vq8B785N+2A2/dDctJ+SEqCxuWmbkP5mVhdvyy+/8i/frrK12RjSib9U\nzQGSNgQ+QUpC2iS9rfAi1YBsKml8VvxyUq3Bl3Or2JVUO3FJbtqtQLvebCfzUdJV8u9JV7XwZu3O\nbdn7T5FqW84uCvF80o//HkXTXyfVBuQV1nFO0fTidQIQERtHxHtKzetJRLxe+L+kEdnxupN0e3zL\nbPo4YHPgooh4JbfszcADPaxzA2BDsmNZIoQ7IuJ3uWWfItXKTMnfFqow/pFZ/L8GNlFqoF6LK4Dd\nlbVRyXwReDoibs/e7wy0AT8u+q4FcBfpu9ivJG0BbArML4rpLcDNpFrJvCDVBlXqxoh44o2FI+4j\n1Xxukm1/ECnxvToiFufKPUZKPM265STH1lYB/CuwElgoadMSZSaQqttPJt3KyL9OzMqMAYiIpaRa\nmn1zy3+ZdBL7RW7araRkYztJm5Gu0m8lnUQLSc5HgQci4qXs/buyf//UZQciVgKP5eYXPB0Rq4qm\nFco8UrSOF0i1BHUj6Z1KY938nXTL5Hngl6RjXmhDVDKezMMl1rmnpDslvUaq7XiOdBunrbhsmXX+\niXTrZ3QF8W8v6SZJr5BuLz7Pm+2aSm2vEpdl2/90to31gN1IyXHBpqTv2y/o+l17jpQA9Rh7Hyj8\nXfywREwHAeuoqF0YqRawUk+VmLaElMRC+vsaTunPtNQ0sy7cJsfWZg+QTjS3ADdmbVuezs0vXAT8\nN6lxcin5H9ofAp+XtC2pTcdepHYbefeQao92JP3APxcRj0i6FThE0jqkZOf/at8tXuvFsr2SXXnf\nROqafSopYVlOao/zA2q4sFJqNLyAlCgdAvyNlJweCEytR9y5bW1Civ9BYAbpM1pBqi07khovDCPi\nLklPkNpz/ZiU7KxL1yRnECkR/Apd2/cUFCeu/aGwv/9Oqm0s5ZWi99V8/1aXmd6nvd9s7eEkx9Zq\nEXGPUo+ea0mJzg4RUWiI+lj278qIqGR02OtJjSG/TOqtMpyut6qIiJWS7iYlOU/yZiPPW0ntHL4M\njCXV7BT8Jft3IqkHDQCShgIbk8b36UlhHZsWrWMUb14118MHs238S0T8KLedT3UTT7GJRe8/Rzpx\nTsnXUEmaViaGcut8lTcbF5droLoXqWHzXvmEV9JOJcpW28j1cuDflIYs+CLwRETcnZv/KOnk/nyF\n37d6Krcvj2b/LmtATJBqjP5BqlUtVupzNuvCt6tsrZf9eE8l/When52EiIjCbZZ/zdqQdJElCPn1\nrAbmk05gBwD3RcT9JTZ5K7ANqRfQrdmyfwceIjXQDd5MfiDVLKwk9TzJOwgYyZs9tbpzE6kmYHrR\n9BmlCqu6LuR5hSvz4t+WI8mdSCPiWeB3wP75di6SdgaKu0uvzpYdkiv3buAzZWLYLuuRUyj7TlLN\nycKIKMSwPPu3eDDANeLPbsccUGI7y0ss353LSInsAcCU7H3eQlJ7lGMlrXEBWvx9q7Nyx6ODlOgc\nld1i68+YiIhO0nd37/zfoKQJpDZvZt1yTY6trbpUh0fE1ZK+BlwI/EzSrlkD1MNICcd9ks4n1e6M\n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\n7WfWOEH19IUvd0KsJKHo72Sl0hNwLXHVui/Fy3X3x9xfqk20qj1pNOOPaDn1uI04kPZ3bdAMt4ab\n2UC4GMzr+nl2OMlp5ldvkpzuTjSDB39gjUTkzeTkOwGbxdChm5c8QU2bdmi3X/hyJ8RKEopSf0yV\nnBCqqS3o6QR83HGnrLG9Wv7Ia/1haMYflEoTrcJn9frrr1d10mjGfe5Jb2q3at1fJ0d9qzefaSsb\nqLWx6fN0ktPUr94kOd1dnYwatX0MH/6/XRKRQnIybtwnY8iQA2Pw4O1LnqAOOODfu63dyZ8Qp0z5\n5xg2bHzFV/Sl/pjKJT5bb71T1clKT8dl9ux5ceedd66xvUr+yItPQKWWKXWSqmS5SrZXr5qj3ixX\n/FlVetKo5fg2Wm9uI9Z60hiIyWCj1PJ9aYZbw335Pa9m3bVcDNbrN6leJkzYLYYNO85JTjO/6nG7\nqtSJptSVefG09dffOrfcd2Lw4LFlv/DlancqaafTU7Ky+eZTSiY+gwevF0cddXxVyUpPxyXizRPQ\nFlt8smxco0ZtGltv/ak1TvDSyNhww02qOk6VLFeqTUDxCa/SWrDiabXWnpVarvjkXeqkUVj3zJmn\nVPUjWkmclexvpfvXU5lqbiNWkpRX0u5joF5Rl1Lr51Lpuoq/L5WsuxluDdczka3kb72cWi4GK/lN\nqte+VOILXzg0/t//m+kkp5lf9Uhyar06yS+37rpzY9SoyWW/8KVqd/K6a6dTOln5TkhjY9Soj8TY\nsZ/pNvHpKVkpV5OS378hQz6/RhI3Zsyn421vaw9p2zX2+aijjitzgv9ebLvtXlUdp0qWK9UmoHj/\nKq0FK55W6XLltt9dMjhs2LtjypQvdDlpFNb9m9/8pqof0UrirHRYhEr2r9bkr9y6ekrKSzXMr7XG\nsi+vqGtNECs54daayFaScNfz86xknytddy01wJUmiJX8rfcUUzW/r5X8JvVlu8tS6+7o8O2qRiQu\nhwGPA68BvwE+3E3ZXic5tV6dlFqu6xe++9qd/JVpJe10uq57RYwe/eGKEp8hQz4UMDvWX3/bkslK\nuZqU/P7NmvU/scUWu+S2d+kbJ6DRo3dc44+8pxP80KFbdnucyvVo67rcmrd31qxCPiWksTFkyIdC\n+mhFtWAp9n1i3XX/qaras9Lb7z4ZLJWgFf/wvfm5X1riR7S6OCv54S03rVityV9P66qmYX6tNZaV\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.plot(rank[1:],citations,'*')\n", - "plt.ylabel('Number of Citations')\n", - "plt.xlabel('Rank of the keyword on Google Scholar')\n", - "plt.title('Keyword: '+keyword)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another interesting way of sorting these results is by the number of citations / year" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "data_ranked['cit/year'] = data_ranked['Citations']/(2017 - data_ranked['Year'])" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RankAuthorTitleCitationsYearSourcecit/year
88ProakisCompanders472082001http://onlinelibrary.wiley.com/doi/10.1002/047...2950.500000
1HaykinCould not catch title230072008Look manually at: https://scholar.google.com/s...2556.333333
2Goodwin, KS SinAdaptive filtering prediction and control54642014https://books.google.com/books?hl=en&lr=&id=0_...1821.333333
53Kumar, P VaraiyaStochastic systems: Estimation, identification...11162015http://epubs.siam.org/doi/pdf/10.1137/1.978161...558.000000
64R JangANFIS: adaptive-network-based fuzzy inference ...122061993http://ieeexplore.ieee.org/abstract/document/2...508.583333
27FarhanAdaptive filters: theory and applications10892013https://books.google.com/books?hl=en&lr=&id=Fm...272.250000
80Chang, B Yu, M VetterliAdaptive wavelet thresholding for image denois...27432000http://ieeexplore.ieee.org/abstract/document/8...161.352941
10SayedFundamentals of adaptive filtering19072003https://books.google.com/books?hl=en&lr=&id=Va...136.214286
42SayedAdaptive filters8042011https://books.google.com/books?hl=en&lr=&id=VB...134.000000
77Van Veen, KM BuckleyBeamforming: A versatile approach to spatial f...34141988http://ieeexplore.ieee.org/abstract/document/665/117.724138
4Manolakis, VK Ingle, SM KogonStatistical and adaptive signal processing: sp...13912005https://pdfs.semanticscholar.org/e4fa/b1d57597...115.916667
60Kalman, RS BucyNew results in linear filtering and prediction...64181961https://fluidsengineering.asmedigitalcollectio...114.607143
50HaykinKalman filtering and neural networks17172001http://onlinelibrary.wiley.com/doi/10.1002/047...107.312500
62Widrow, JR Glover, JM McCool…Adaptive noise cancelling: Principles and appl...44341975http://ieeexplore.ieee.org/abstract/document/1...105.571429
100Moon, WC StirlingCould not catch title17532000Look manually at: https://scholar.google.com/s...103.117647
19Nummiaro, E KolleAn adaptive color-based particle filter13942003http://www.sciencedirect.com/science/article/p...99.571429
98P Blom, Y BaThe interacting multiple model algorithm for s...22861988http://ieeexplore.ieee.org/abstract/document/1...78.827586
38WardSpace-time adaptive processing for airborne radar14541998http://digital-library.theiet.org/content/conf...76.526316
28BlackmanMultiple-target tracking with radar applications21761986http://adsabs.harvard.edu/abs/1986ah...bookQ....B70.193548
40Bishop, BJ Etherton…Adaptive sampling with the ensemble transform ...10922001http://journals.ametsoc.org/doi/abs/10.1175/15...68.250000
16R DinizAdaptive filtering12861997http://link.springer.com/content/pdf/10.1007/9...64.300000
21Gustafsson, F GustafssonAdaptive filtering and change detection10902000http://citeseerx.ist.psu.edu/viewdoc/download?...64.117647
14List, A Joch, J Lainema, G Bjontegaard…Adaptive deblocking filter8602003http://ieeexplore.ieee.org/abstract/document/1...61.428571
26Zhou, R Chellappa…Visual tracking and recognition using appearan...7662004http://ieeexplore.ieee.org/abstract/document/1...58.923077
35Griffiths, CW JimAn alternative approach to linearly constraine...20231982http://ieeexplore.ieee.org/abstract/document/1...57.800000
47FrostAn algorithm for linearly constrained adaptive...24921972http://ieeexplore.ieee.org/abstract/document/1...55.377778
90Ko, YH LeeCenter weighted median filters and their appli...12881991http://ieeexplore.ieee.org/abstract/document/8...49.538462
5Frost, JA Stiles, KS Shanmugan…A model for radar images and its application t...16691982http://ieeexplore.ieee.org/abstract/document/4...47.685714
8Hwang, RA HaddadAdaptive median filters: new algorithms and re...10241995http://ieeexplore.ieee.org/abstract/document/3...46.545455
44Grisettiyz, C Stachniss…Improving grid-based slam with rao-blackwelliz...5462005http://ieeexplore.ieee.org/abstract/document/1...45.500000
.....................
59Mathews, Z XieA stochastic gradient adaptive filter with gra...4631993http://ieeexplore.ieee.org/abstract/document/2...19.291667
84Glentis, K Berberidis…Efficient least squares adaptive algorithms fo...3311999http://ieeexplore.ieee.org/abstract/document/7...18.388889
74AlkuGlottal wave analysis with pitch synchronous i...4551992http://www.sciencedirect.com/science/article/p...18.200000
52FriedlanderLattice filters for adaptive processing6351982http://ieeexplore.ieee.org/abstract/document/1...18.142857
66Li, P StoicaAn adaptive filtering approach to spectral est...3801996http://ieeexplore.ieee.org/abstract/document/5...18.095238
99Widrow, M BilelloAdaptive inverse control3961993http://ieeexplore.ieee.org/abstract/document/3...16.500000
12Honig, DG MesserschmittCould not catch title5431984Look manually at: https://scholar.google.com/s...16.454545
46NehoraiA minimal parameter adaptive notch filter with...5251985http://ieeexplore.ieee.org/abstract/document/1...16.406250
63Xue, YH Hu, WJ TompkinsNeural-network-based adaptive matched filterin...3951992http://ieeexplore.ieee.org/abstract/document/1...15.800000
81Treichler, CR Johnson Jr, MJ LarimoreTheory and design of adaptive filters4411987http://dl.acm.org/citation.cfm?id=SERIES10554....14.700000
72MagillOptimal adaptive estimation of sampled stochas...7591965http://ieeexplore.ieee.org/abstract/document/1...14.596154
25MehraApproaches to adaptive filtering6521972http://ieeexplore.ieee.org/abstract/document/1...14.488889
58Harris, D Chabries, F BishopA variable step (VS) adaptive filter algorithm4461986http://ieeexplore.ieee.org/abstract/document/1...14.387097
49ZelinskiA microphone array with adaptive post-filterin...3941988http://ieeexplore.ieee.org/abstract/document/1...13.586207
45Clark, S Mitra, S ParkerBlock implementation of adaptive digital filters4871981http://ieeexplore.ieee.org/abstract/document/1...13.527778
65Eleftheriou, D FalconerTracking properties and steady-state performan...4151986http://ieeexplore.ieee.org/abstract/document/1...13.387097
89M Slock, T KailathNumerically stable fast transversal filters fo...3421991http://ieeexplore.ieee.org/abstract/document/8...13.153846
97GloverAdaptive noise canceling applied to sinusoidal...5001977http://ieeexplore.ieee.org/abstract/document/1...12.500000
22WoodyCharacterization of an adaptive filter for the...6171967http://link.springer.com/article/10.1007/BF024...12.340000
61MacchiAdaptative Processing: the Least Mean Squares ...2631995http://www.sidalc.net/cgi-bin/wxis.exe/?IsisSc...11.954545
83AndersonNumerical integration of related Hankel transf...4291979http://library.seg.org/doi/abs/10.1190/1.144100711.289474
69FujitaAdaptive filter model of the cerebellum3731982http://link.springer.com/article/10.1007/BF003...10.657143
94FeintuchAn adaptive recursive LMS filter3661976http://ieeexplore.ieee.org/abstract/document/1...8.926829
96PomalazAn adaptative, nonlinear edge-preserving filter1351984http://ieeexplore.ieee.org/abstract/document/1...4.090909
95Macchi, E EwedaSecond-order convergence analysis of stochasti...1371983http://ieeexplore.ieee.org/abstract/document/1...4.029412
51OlivoAutomatic detection of spots in biological ima...221996http://ieeexplore.ieee.org/abstract/document/5...1.047619
3SamyAn adaptative image sequence filtering scheme ...241986http://proceedings.spiedigitallibrary.org/proc...0.774194
9HaykinCould not catch title7510Look manually at: https://scholar.google.com/s...0.372335
41WidrowAdaptive filters5270http://isl-www.stanford.edu/~widrow/papers/b19...0.261279
18N Cowan, PM GrantCould not catch title4750Look manually at: https://scholar.google.com/s...0.235498
\n", - "

100 rows × 6 columns

\n", - "
" - ], - "text/plain": [ - "Rank Author \\\n", - "88 Proakis \n", - "1 Haykin \n", - "2 Goodwin, KS Sin \n", - "53 Kumar, P Varaiya \n", - "64 R Jang \n", - "27 Farhan \n", - "80 Chang, B Yu, M Vetterli \n", - "10 Sayed \n", - "42 Sayed \n", - "77 Van Veen, KM Buckley \n", - "4 Manolakis, VK Ingle, SM Kogon \n", - "60 Kalman, RS Bucy \n", - "50 Haykin \n", - "62 Widrow, JR Glover, JM McCool… \n", - "100 Moon, WC Stirling \n", - "19 Nummiaro, E Kolle \n", - "98 P Blom, Y Ba \n", - "38 Ward \n", - "28 Blackman \n", - "40 Bishop, BJ Etherton… \n", - "16 R Diniz \n", - "21 Gustafsson, F Gustafsson \n", - "14 List, A Joch, J Lainema, G Bjontegaard… \n", - "26 Zhou, R Chellappa… \n", - "35 Griffiths, CW Jim \n", - "47 Frost \n", - "90 Ko, YH Lee \n", - "5 Frost, JA Stiles, KS Shanmugan… \n", - "8 Hwang, RA Haddad \n", - "44 Grisettiyz, C Stachniss… \n", - ".. ... \n", - "59 Mathews, Z Xie \n", - "84 Glentis, K Berberidis… \n", - "74 Alku \n", - "52 Friedlander \n", - "66 Li, P Stoica \n", - "99 Widrow, M Bilello \n", - "12 Honig, DG Messerschmitt \n", - "46 Nehorai \n", - "63 Xue, YH Hu, WJ Tompkins \n", - "81 Treichler, CR Johnson Jr, MJ Larimore \n", - "72 Magill \n", - "25 Mehra \n", - "58 Harris, D Chabries, F Bishop \n", - "49 Zelinski \n", - "45 Clark, S Mitra, S Parker \n", - "65 Eleftheriou, D Falconer \n", - "89 M Slock, T Kailath \n", - "97 Glover \n", - "22 Woody \n", - "61 Macchi \n", - "83 Anderson \n", - "69 Fujita \n", - "94 Feintuch \n", - "96 Pomalaz \n", - "95 Macchi, E Eweda \n", - "51 Olivo \n", - "3 Samy \n", - "9 Haykin \n", - "41 Widrow \n", - "18 N Cowan, PM Grant \n", - "\n", - "Rank Title Citations Year \\\n", - "88 Companders 47208 2001 \n", - "1 Could not catch title 23007 2008 \n", - "2 Adaptive filtering prediction and control 5464 2014 \n", - "53 Stochastic systems: Estimation, identification... 1116 2015 \n", - "64 ANFIS: adaptive-network-based fuzzy inference ... 12206 1993 \n", - "27 Adaptive filters: theory and applications 1089 2013 \n", - "80 Adaptive wavelet thresholding for image denois... 2743 2000 \n", - "10 Fundamentals of adaptive filtering 1907 2003 \n", - "42 Adaptive filters 804 2011 \n", - "77 Beamforming: A versatile approach to spatial f... 3414 1988 \n", - "4 Statistical and adaptive signal processing: sp... 1391 2005 \n", - "60 New results in linear filtering and prediction... 6418 1961 \n", - "50 Kalman filtering and neural networks 1717 2001 \n", - "62 Adaptive noise cancelling: Principles and appl... 4434 1975 \n", - "100 Could not catch title 1753 2000 \n", - "19 An adaptive color-based particle filter 1394 2003 \n", - "98 The interacting multiple model algorithm for s... 2286 1988 \n", - "38 Space-time adaptive processing for airborne radar 1454 1998 \n", - "28 Multiple-target tracking with radar applications 2176 1986 \n", - "40 Adaptive sampling with the ensemble transform ... 1092 2001 \n", - "16 Adaptive filtering 1286 1997 \n", - "21 Adaptive filtering and change detection 1090 2000 \n", - "14 Adaptive deblocking filter 860 2003 \n", - "26 Visual tracking and recognition using appearan... 766 2004 \n", - "35 An alternative approach to linearly constraine... 2023 1982 \n", - "47 An algorithm for linearly constrained adaptive... 2492 1972 \n", - "90 Center weighted median filters and their appli... 1288 1991 \n", - "5 A model for radar images and its application t... 1669 1982 \n", - "8 Adaptive median filters: new algorithms and re... 1024 1995 \n", - "44 Improving grid-based slam with rao-blackwelliz... 546 2005 \n", - ".. ... ... ... \n", - "59 A stochastic gradient adaptive filter with gra... 463 1993 \n", - "84 Efficient least squares adaptive algorithms fo... 331 1999 \n", - "74 Glottal wave analysis with pitch synchronous i... 455 1992 \n", - "52 Lattice filters for adaptive processing 635 1982 \n", - "66 An adaptive filtering approach to spectral est... 380 1996 \n", - "99 Adaptive inverse control 396 1993 \n", - "12 Could not catch title 543 1984 \n", - "46 A minimal parameter adaptive notch filter with... 525 1985 \n", - "63 Neural-network-based adaptive matched filterin... 395 1992 \n", - "81 Theory and design of adaptive filters 441 1987 \n", - "72 Optimal adaptive estimation of sampled stochas... 759 1965 \n", - "25 Approaches to adaptive filtering 652 1972 \n", - "58 A variable step (VS) adaptive filter algorithm 446 1986 \n", - "49 A microphone array with adaptive post-filterin... 394 1988 \n", - "45 Block implementation of adaptive digital filters 487 1981 \n", - "65 Tracking properties and steady-state performan... 415 1986 \n", - "89 Numerically stable fast transversal filters fo... 342 1991 \n", - "97 Adaptive noise canceling applied to sinusoidal... 500 1977 \n", - "22 Characterization of an adaptive filter for the... 617 1967 \n", - "61 Adaptative Processing: the Least Mean Squares ... 263 1995 \n", - "83 Numerical integration of related Hankel transf... 429 1979 \n", - "69 Adaptive filter model of the cerebellum 373 1982 \n", - "94 An adaptive recursive LMS filter 366 1976 \n", - "96 An adaptative, nonlinear edge-preserving filter 135 1984 \n", - "95 Second-order convergence analysis of stochasti... 137 1983 \n", - "51 Automatic detection of spots in biological ima... 22 1996 \n", - "3 An adaptative image sequence filtering scheme ... 24 1986 \n", - "9 Could not catch title 751 0 \n", - "41 Adaptive filters 527 0 \n", - "18 Could not catch title 475 0 \n", - "\n", - "Rank Source cit/year \n", - "88 http://onlinelibrary.wiley.com/doi/10.1002/047... 2950.500000 \n", - "1 Look manually at: https://scholar.google.com/s... 2556.333333 \n", - "2 https://books.google.com/books?hl=en&lr=&id=0_... 1821.333333 \n", - "53 http://epubs.siam.org/doi/pdf/10.1137/1.978161... 558.000000 \n", - "64 http://ieeexplore.ieee.org/abstract/document/2... 508.583333 \n", - "27 https://books.google.com/books?hl=en&lr=&id=Fm... 272.250000 \n", - "80 http://ieeexplore.ieee.org/abstract/document/8... 161.352941 \n", - "10 https://books.google.com/books?hl=en&lr=&id=Va... 136.214286 \n", - "42 https://books.google.com/books?hl=en&lr=&id=VB... 134.000000 \n", - "77 http://ieeexplore.ieee.org/abstract/document/665/ 117.724138 \n", - "4 https://pdfs.semanticscholar.org/e4fa/b1d57597... 115.916667 \n", - "60 https://fluidsengineering.asmedigitalcollectio... 114.607143 \n", - "50 http://onlinelibrary.wiley.com/doi/10.1002/047... 107.312500 \n", - "62 http://ieeexplore.ieee.org/abstract/document/1... 105.571429 \n", - "100 Look manually at: https://scholar.google.com/s... 103.117647 \n", - "19 http://www.sciencedirect.com/science/article/p... 99.571429 \n", - "98 http://ieeexplore.ieee.org/abstract/document/1... 78.827586 \n", - "38 http://digital-library.theiet.org/content/conf... 76.526316 \n", - "28 http://adsabs.harvard.edu/abs/1986ah...bookQ....B 70.193548 \n", - "40 http://journals.ametsoc.org/doi/abs/10.1175/15... 68.250000 \n", - "16 http://link.springer.com/content/pdf/10.1007/9... 64.300000 \n", - "21 http://citeseerx.ist.psu.edu/viewdoc/download?... 64.117647 \n", - "14 http://ieeexplore.ieee.org/abstract/document/1... 61.428571 \n", - "26 http://ieeexplore.ieee.org/abstract/document/1... 58.923077 \n", - "35 http://ieeexplore.ieee.org/abstract/document/1... 57.800000 \n", - "47 http://ieeexplore.ieee.org/abstract/document/1... 55.377778 \n", - "90 http://ieeexplore.ieee.org/abstract/document/8... 49.538462 \n", - "5 http://ieeexplore.ieee.org/abstract/document/4... 47.685714 \n", - "8 http://ieeexplore.ieee.org/abstract/document/3... 46.545455 \n", - "44 http://ieeexplore.ieee.org/abstract/document/1... 45.500000 \n", - ".. ... ... \n", - "59 http://ieeexplore.ieee.org/abstract/document/2... 19.291667 \n", - "84 http://ieeexplore.ieee.org/abstract/document/7... 18.388889 \n", - "74 http://www.sciencedirect.com/science/article/p... 18.200000 \n", - "52 http://ieeexplore.ieee.org/abstract/document/1... 18.142857 \n", - "66 http://ieeexplore.ieee.org/abstract/document/5... 18.095238 \n", - "99 http://ieeexplore.ieee.org/abstract/document/3... 16.500000 \n", - "12 Look manually at: https://scholar.google.com/s... 16.454545 \n", - "46 http://ieeexplore.ieee.org/abstract/document/1... 16.406250 \n", - "63 http://ieeexplore.ieee.org/abstract/document/1... 15.800000 \n", - "81 http://dl.acm.org/citation.cfm?id=SERIES10554.... 14.700000 \n", - "72 http://ieeexplore.ieee.org/abstract/document/1... 14.596154 \n", - "25 http://ieeexplore.ieee.org/abstract/document/1... 14.488889 \n", - "58 http://ieeexplore.ieee.org/abstract/document/1... 14.387097 \n", - "49 http://ieeexplore.ieee.org/abstract/document/1... 13.586207 \n", - "45 http://ieeexplore.ieee.org/abstract/document/1... 13.527778 \n", - "65 http://ieeexplore.ieee.org/abstract/document/1... 13.387097 \n", - "89 http://ieeexplore.ieee.org/abstract/document/8... 13.153846 \n", - "97 http://ieeexplore.ieee.org/abstract/document/1... 12.500000 \n", - "22 http://link.springer.com/article/10.1007/BF024... 12.340000 \n", - "61 http://www.sidalc.net/cgi-bin/wxis.exe/?IsisSc... 11.954545 \n", - "83 http://library.seg.org/doi/abs/10.1190/1.1441007 11.289474 \n", - "69 http://link.springer.com/article/10.1007/BF003... 10.657143 \n", - "94 http://ieeexplore.ieee.org/abstract/document/1... 8.926829 \n", - "96 http://ieeexplore.ieee.org/abstract/document/1... 4.090909 \n", - "95 http://ieeexplore.ieee.org/abstract/document/1... 4.029412 \n", - "51 http://ieeexplore.ieee.org/abstract/document/5... 1.047619 \n", - "3 http://proceedings.spiedigitallibrary.org/proc... 0.774194 \n", - "9 Look manually at: https://scholar.google.com/s... 0.372335 \n", - "41 http://isl-www.stanford.edu/~widrow/papers/b19... 0.261279 \n", - "18 Look manually at: https://scholar.google.com/s... 0.235498 \n", - "\n", - "[100 rows x 6 columns]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_ranked.sort_values('cit/year', ascending=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "anaconda-cloud": {}, - "kernelspec": { - "display_name": "Python [default]", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/sort-google-scholar-V1/Example-Python3.ipynb b/sort-google-scholar-V1/Example-Python3.ipynb deleted file mode 100644 index 0acccfe..0000000 --- a/sort-google-scholar-V1/Example-Python3.ipynb +++ /dev/null @@ -1,173 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 36, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Update these variables according to your requirement\n", - "keyword = \"Leadership Chinese SOEs\" # the double quote will look for the exact keyword,\n", - " # the simple quote will also look for similar keywords\n", - "number_of_results = 100 # number of results to look for on Google Scholar\n", - "start_year = 2017 # start range for search\n", - "end_year = 2018 # end range for search\n", - "save_database = False # choose if you would like to save the database to .csv (recommended to correctly visualize the URLs)\n", - "path = 'csv/'+keyword+'_'+str(start_year)+'_'+str(end_year)+'.csv' # path to save the data" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# -*- coding: utf-8 -*-\n", - "import requests\n", - "from bs4 import BeautifulSoup\n", - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "\n", - "\n", - "def get_citations(content):\n", - " out = 0\n", - " for char in range(0,len(content)):\n", - " if content[char:char+9] == 'Cited by ':\n", - " init = char+9 \n", - " for end in range(init+1,init+6):\n", - " if content[end] == '<':\n", - " break\n", - " out = content[init:end]\n", - " return int(out)\n", - " \n", - "def get_year(content):\n", - " for char in range(0,len(content)):\n", - " if content[char] == '-':\n", - " out = content[char-5:char-1]\n", - " if not out.isdigit():\n", - " out = 0\n", - " return int(out)\n", - "\n", - "def get_author(content):\n", - " for char in range(0,len(content)):\n", - " if content[char] == '-':\n", - " out = content[2:char-1]\n", - " break\n", - " return out\n", - "\n", - "# Start new session\n", - "session = requests.Session()\n", - "\n", - "# Variables\n", - "links = list()\n", - "title = list()\n", - "citations = list()\n", - "year = list()\n", - "rank = list()\n", - "author = list()\n", - "rank.append(0) # initialization necessary for incremental purposes\n", - "\n", - "# Get content \n", - "for n in range(0, number_of_results, 10): \n", - " url = 'https://scholar.google.com/scholar?start='+str(n)+'&q='+keyword.replace(' ','+')+'&as_ylo='+str(start_year)+'&as_yhi='\ - +str(end_year)\n", - " page = session.get(url)\n", - " c = page.content\n", - "# print(c)\n", - " # Create parser\n", - " soup = BeautifulSoup(c, 'html.parser')\n", - " \n", - " # Get stuff\n", - " mydivs = soup.findAll(\"div\", { \"class\" : \"gs_r\" })\n", - " \n", - " for div in mydivs:\n", - " try:\n", - " links.append(div.find('h3').find('a').get('href'))\n", - " except: # catch *all* exceptions\n", - " links.append('Look manually at: https://scholar.google.com/scholar?start='\\\n", - " +str(n)+'&q'+keyword.replace(' ','+'))\n", - " \n", - " try:\n", - " title.append(div.find('h3').find('a').text)\n", - " except: \n", - " title.append('Could not catch title')\n", - " \n", - " citations.append(get_citations(str(div.format_string)))\n", - " year.append(get_year(div.find('div',{'class' : 'gs_a'}).text))\n", - " author.append(get_author(div.find('div',{'class' : 'gs_a'}).text))\n", - " rank.append(rank[-1]+1)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "save_database=True" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Done!\n" - ] - } - ], - "source": [ - "# Create a dataset and sort by the number of citations\n", - "data = pd.DataFrame(list(zip(author, title, citations, year, links)), index = rank[1:], columns=['Author', 'Title', 'Citations', 'Year', 'Source'])\n", - "data = data.rename_axis('Rank', axis=\"columns\")\n", - "\n", - "data_ranked = data.sort_values('Citations', ascending=False)\n", - "\n", - "# Save results\n", - "if save_database:\n", - " data_ranked.to_csv(path, encoding='utf-8')\n", - "\n", - "print('Done!')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/sort-google-scholar-V1/README.md b/sort-google-scholar-V1/README.md deleted file mode 100644 index c456bfc..0000000 --- a/sort-google-scholar-V1/README.md +++ /dev/null @@ -1,35 +0,0 @@ -## Sort Google Scholar Results V1 -This Python code ranks publications data from Google Scholar by the number -of citations. -It is useful for finding relevant papers in a specific field. - -The data acquired from Google Scholar is Title, Citations, Links and Rank. -The example of the code will look for the top 100 papers related to the keyword -'non intrusive load monitoring', and rank them by the number of citations -As output this program will plot the number of citations in the Y axis and the -rank of the result in the X axis. It also, optionally, export the database to -a .csv file. -Please update the keyword and other initialization variables - - -### Google Robot Checking (Does not seem to work) -If you are having problems with Google robot checking, as a suggestion, you can try using a proxy. Follow those steps: - -1. Go to the website https://free-proxy-list.net/ and pick one proxy (example: 200.162.142.178). - -2. Add a new line with the chosen proxy, for example: -``` -proxies = { - 'http': 'http://200.162.142.178:3128', - 'https': 'http://200.162.142.178:3128', -} -``` - -3. Add `proxies` as an attribute in `session.get`. In other words, change the line with `page = session.get(url)` to `page = session.get(url, proxies=proxies)`. - -4. I hope that works! For a feedback, send me an email: fernando [dot] wittmann [at] gmail [dot] com - -If this project was helpful to you in any way, feel free to buy me a cup of coffee :) - -[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QAQ4YJFQVXLMA&source=url) - diff --git a/sort-google-scholar-V1/sortby_citations_google_scholar.py b/sort-google-scholar-V1/sortby_citations_google_scholar.py deleted file mode 100644 index 9d6077e..0000000 --- a/sort-google-scholar-V1/sortby_citations_google_scholar.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This code creates a database with a list of publications data from Google -Scholar. -The data acquired from GS is Title, Citations, Links and Rank. -It is useful for finding relevant papers by sorting by the number of citations -This example will look for the top 100 papers related to the keyword -'non intrusive load monitoring', so that you can rank them by the number of citations - -As output this program will plot the number of citations in the Y axis and the -rank of the result in the X axis. It also, optionally, export the database to -a .csv file. - -Before using it, please update the initial variables - -""" - -import requests -from bs4 import BeautifulSoup -import matplotlib.pyplot as plt -import pandas as pd - - -def get_citations(content): - out = 0 - for char in range(0,len(content)): - if content[char:char+9] == 'Cited by ': - init = char+9 - for end in range(init+1,init+6): - if content[end] == '<': - break - out = content[init:end] - return int(out) - -def get_year(content): - for char in range(0,len(content)): - if content[char] == '-': - out = content[char-5:char-1] - if not out.isdigit(): - out = 0 - return int(out) - -def get_author(content): - for char in range(0,len(content)): - if content[char] == '-': - out = content[2:char-1] - break - return out - -# Update these variables according to your requirement -keyword = "'non intrusive load monitoring'" # the double quote will look for the exact keyword, - # the simple quote will also look for similar keywords -number_of_results = 100 # number of results to look for on Google Scholar -save_database = False # choose if you would like to save the database to .csv -path = 'C:/_wittmann/nilm_100_exact_author.csv' # path to save the data - -# Start new session -session = requests.Session() - -# Variables -links = list() -title = list() -citations = list() -year = list() -rank = list() -author = list() -rank.append(0) # initialization necessary for incremental purposes - -# Get content from 1000 URLs -for n in range(0, number_of_results, 10): - url = 'https://scholar.google.com/scholar?start='+str(n)+'&q='+keyword.replace(' ','+') - page = session.get(url) - c = page.content - - # Create parser - soup = BeautifulSoup(c, 'html.parser') - - # Get stuff - mydivs = soup.findAll("div", { "class" : "gs_r" }) - - for div in mydivs: - try: - links.append(div.find('h3').find('a').get('href')) - except: # catch *all* exceptions - links.append('Look manually at: https://scholar.google.com/scholar?start='+str(n)+'&q=non+intrusive+load+monitoring') - - try: - title.append(div.find('h3').find('a').text) - except: - title.append('Could not catch title') - - citations.append(get_citations(str(div.format_string))) - year.append(get_year(div.find('div',{'class' : 'gs_a'}).text)) - author.append(get_author(div.find('div',{'class' : 'gs_a'}).text)) - rank.append(rank[-1]+1) - -# Create a dataset and sort by the number of citations -data = pd.DataFrame(zip(author, title, citations, year, links), index = rank[1:], - columns=['Author', 'Title', 'Citations', 'Year', 'Source']) -data.index.name = 'Rank' - -data_ranked = data.sort_values(by='Citations', ascending=False) -print data_ranked - -# Plot by citation number -plt.plot(rank[1:],citations,'*') -plt.ylabel('Number of Citations') -plt.xlabel('Rank of the keyword on Google Scholar') -plt.title('Keyword: '+keyword) - -# Save results -if save_database: - data_ranked.to_csv(path, encoding='utf-8') # Change the path - diff --git a/sortgs.py b/sortgs.py index 2f5f890..1b9c0f6 100755 --- a/sortgs.py +++ b/sortgs.py @@ -22,6 +22,7 @@ import pandas as pd from time import sleep import warnings +import os # Solve conflict between raw_input and input on Python 2 and Python 3 import sys @@ -30,7 +31,7 @@ # Default Parameters KEYWORD = 'machine learning' # Default argument if command line is empty NRESULTS = 100 # Fetch 100 articles -CSVPATH = '.' # Current folder +CSVPATH = os.getcwd() # Current folder as default path SAVECSV = True SORTBY = 'Citations' PLOT_RESULTS = False @@ -53,7 +54,7 @@ def get_command_line_args(): # Command line arguments parser = argparse.ArgumentParser(description='Arguments') - parser.add_argument('--kw', type=str, help="""Keyword to be searched. Use double quote followed by simple quote to search for an exact keyword. Example: "'exact keyword'" """) + parser.add_argument('kw', type=str, help="""Keyword to be searched. Use double quote followed by simple quote to search for an exact keyword. Example: "'exact keyword'" """, default=KEYWORD) parser.add_argument('--sortby', type=str, help='Column to be sorted by. Default is by the columns "Citations", i.e., it will be sorted by the number of citations. If you want to sort by citations per year, use --sortby "cit/year"') parser.add_argument('--nresults', type=int, help='Number of articles to search on Google Scholar. Default is 100. (carefull with robot checking if value is too high)') parser.add_argument('--csvpath', type=str, help='Path to save the exported csv file. By default it is the current folder') @@ -66,6 +67,11 @@ def get_command_line_args(): # Parse and read arguments and assign them to variables if exists args, _ = parser.parse_known_args() + # Check if no arguments were provided and print help if so + if len(sys.argv) == 1: + parser.print_help() + sys.exit(0) + keyword = KEYWORD if args.kw: keyword = args.kw @@ -180,6 +186,9 @@ def main(): # Get command line arguments keyword, number_of_results, save_database, path, sortby_column, plot_results, start_year, end_year, debug = get_command_line_args() + print("Running with the following parameters:") + print(f"Keyword: {keyword}, Number of results: {number_of_results}, Save database: {save_database}, Path: {path}, Sort by: {sortby_column}, Plot results: {plot_results}, Start year: {start_year}, End year: {end_year}, Debug: {debug}") + # Create main URL based on command line arguments if start_year: GSCHOLAR_MAIN_URL = GSCHOLAR_URL + STARTYEAR_URL.format(start_year) @@ -308,6 +317,7 @@ def main(): fpath_csv = os.path.join(path,keyword.replace(' ','_')+'.csv') fpath_csv = fpath_csv[:MAX_CSV_FNAME] data_ranked.to_csv(fpath_csv, encoding='utf-8') + print('Results saved to', fpath_csv) if __name__ == '__main__': main() diff --git a/test/test_sortgs.py b/test/test_sortgs.py index e95744e..ccf117a 100644 --- a/test/test_sortgs.py +++ b/test/test_sortgs.py @@ -16,6 +16,16 @@ def setUpClass(self): os.system("python sortgs.py --debug --kw 'machine learning' --nresults 20 --endyear 2022 --sortby 'cit/year'") self.df_top_sorted_cit_per_year=pd.read_csv('machine_learning.csv') + + # Repeat the above, but testing the cli command + os.system("sortgs 'machine learning' --debug --nresults 10 --endyear 2022") + self.df_top_10_cli=pd.read_csv('machine_learning.csv') + + os.system("sortgs 'machine learning' --debug --nresults 20 --endyear 2022") + self.df_top_20_cli=pd.read_csv('machine_learning.csv') + + os.system("sortgs 'machine learning' --debug --nresults 20 --endyear 2022 --sortby 'cit/year'") + self.df_top_sorted_cit_per_year_cli=pd.read_csv('machine_learning.csv') def test_get_10_results(self): self.assertEqual(len(self.df_top_10), 10) @@ -47,6 +57,34 @@ def test_cit_per_year_sorted(self): def test_csv_exists(self): os.system("python sortgs.py --debug --kw 'machine learning' --nresults 10") self.assertTrue(os.path.exists('machine_learning.csv')) + + def test_cli_get_10_results(self): + self.assertEqual(len(self.df_top_10_cli), 10) + + def test_cli_get_20_results(self): + self.assertEqual(len(self.df_top_20_cli), 20) + + def test_cli_is_sorted(self): + df=self.df_top_20_cli + top_citations=list(df.Citations.values[:5]) + self.assertEqual(top_citations, [49230, 8603, 3166, 3069, 2853]) + + def test_cli_top_result(self): + df=self.df_top_20_cli + top_author = str(df.Author.values[0]) + top_citation = int(df.Citations.values[0]) + top_cit_per_year = int(df['cit/year'].values[0]) + top_results = [top_author, top_citation, top_cit_per_year] + self.assertEqual(top_results, [' Bishop', 49230, 2896]) + + def test_cli_cit_per_year_sorted(self): + df=self.df_top_sorted_cit_per_year_cli + top_citations=list(df.Citations.values[:5]) + top_cit_per_year = list(df['cit/year'].values[:5]) + top_results = [top_citations, top_cit_per_year] + self.assertEqual(top_results, [[49230, 8603, 2853, 3166, 2416], + [2896, 782, 571, 352, 302]]) + if __name__=='__main__':