'IR: How do you match documents based on index values and return the document?

I have a pandas data frame df which has the top 10 documents from a corpus ranked based on their BM25 score, and indexed by their Doc_ID.

Doc_ID Rank BM25 Score
1234 1 3.3472
5678 2 3.3238

I also have a list documents containing all of the documents paired up with their Doc_ID, such that the list is in the following form: [['First Doc_ID', 'First doc text], ['Second Doc_ID', 'Second doc text], ...].

I need to take the Doc_ID for the top 3 ranked documents in df, and match each one with the corresponding Doc_ID in documents and print out the document text. I know how to get the Doc_ID for a particular rank from df by doing df.index[df['Rank'] == 1][0], but I'm unsure how to go from there to get the corresponding document text.



Solution 1:[1]

You can convert your list to DataFrame and merge:

documents = [[1234, 'First doc text'],
             [5678, 'Second doc text'],
             [5679, 'Third doc text'],
             [5680, 'Fourth doc text']]

(df[df['Rank'].le(3)]
 .merge(pd.DataFrame(documents,
                     columns=['Doc_ID', 'Text']),
        on='Doc_ID')
)

output:

   Doc_ID  Rank  BM25 Score             Text
0    1234     1      3.3472   First doc text
1    5678     2      3.3238  Second doc text
2    5679     3      3.2000   Third doc text

used input:

   Doc_ID  Rank  BM25 Score
0    1234     1      3.3472
1    5678     2      3.3238
2    5679     3      3.2000
3    5680     4      3.1000

Alternatively, if you want a list using python:

top3 = set(df.loc[df['Rank'].le(3), 'Doc_ID'])
out = [text for ID, text in documents if ID in top3]

output: ['First doc text', 'Second doc text', 'Third doc text']

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 desertnaut