📜  项目理念——使用 NLP 从旧报纸中搜索新闻

📅  最后修改于: 2022-05-13 01:54:40.565000             🧑  作者: Mango

项目理念——使用 NLP 从旧报纸中搜索新闻

我们知道报纸是知识的丰富来源。当一个人需要有关特定主题或主题的一些信息时,他会在网上搜索,但很难从与我们的搜索相关的区域性地方报纸中获取所有旧新闻文章。由于并非所有当地报纸都提供在线搜索服务。在本文中,我们将提出一个想法来解决这个问题。

做什么项目?

  • 该项目使用来自旧区域报纸的报纸图像的图像或 pdf作为数据库的输入。
  • 该模型将使用Pytesseract从图像中提取文本
  • 来自 Pytesseract 的文本将通过NLP实践进行清理,以简化和消除对我们没有帮助的词(停用词)。
  • 数据将以键值对的形式保存,其中键具有图像路径,值具有图像中的关键字。
  • 搜索:当用户访问网站时,他会在搜索框中输入主题名称或实体名称,然后报纸的图像将加载到屏幕上。

为什么是自然语言处理?

报纸文章中包含很多对我们无用的文章、介词和其他停用词,因此 NLP 可以帮助我们去除这些停用词。它还有助于获得独特的单词。

使用的技术:

  • NLTK
  • Python

使用的工具 :

  • 谷歌合作实验室

使用的库:

  • pytesseract:图像到文本。
  • NLTK:文本预处理、过滤。
  • 熊猫:存储数据帧。

用例图

分步实施:

库安装

首先,在 colab 上安装所需的库。

Python3
!pip install nltk
!pip install pytesseract
  
!sudo apt install tesseract-ocr
  
# to check if it installed properly
# !which tesseract
# pytesseract.pytesseract.tesseract_cmd = (
#     r'/usr/bin/tesseract'
# )


Python3
import io
import glob
import os
from PIL import Image
import cv2
import pytesseract 
# /usr/bin/tesseract
import pandas as pd
import nltk
nltk.download('popular')
nltk.download('stopwords')
nltk.download('wordnet')
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
from nltk.stem.wordnet import WordNetLemmatizer
from IPython.display import Image
from google.colab.patches import cv2_imshow


Python3
def pre(text):
    text = text.lower()
    tokenizer = RegexpTokenizer(r'\w+')
    new_words = tokenizer.tokenize(text)
    stop_words = list(stopwords.words("english"))
    filtered_words = []
      
    for w in new_words:
        if w not in stop_words:
            filtered_words.append(w)
    unique = []
  
    for w in filtered_words:
        if w not in unique:
            unique.append(w)
    res = ' '.join([str(elem) for elem in unique])
    res = res.lower()
      
    return res


Python
def to_df(imgno):
  text = pytesseract.image_to_string(imgno)
  out = pre(text)
  data = {'filename':imgno,
          'text':out}
  return data


Python3
i=0
dff=pd.DataFrame()


Python3
images = []
folder = "/content/"
  
for filename in os.listdir(folder):
    img = cv2.imread(os.path.join(folder, filename))
      
    if img is not None:
        print(filename)
        images.append(filename)


Python3
for u in images:
  i += 1
  data = to_df(u)
  dff = dff.append(pd.DataFrame(data, index=[i]))
  
print(dff)


Python3
# sample text output after processing image
dff.iloc[0]['text']


Python3
# saving the dataframe
dff.to_csv('save newsdf.csv')


Python3
data = pd.read_csv('/content/save newsdf.csv')
data


Python3
txt= 'modi'
index= data['text'].str.find(txt )
index


Python3
#  we are showing the first result here
for i in range(len(index)):
  
    if (index[i] != -1):
        a.append(i)
  
try:
    res = data.iloc[a[0]]['filename']
except:
    print("no file")
      
Image(res)


让我们导入所有必要的库:

蟒蛇3

import io
import glob
import os
from PIL import Image
import cv2
import pytesseract 
# /usr/bin/tesseract
import pandas as pd
import nltk
nltk.download('popular')
nltk.download('stopwords')
nltk.download('wordnet')
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
from nltk.stem.wordnet import WordNetLemmatizer
from IPython.display import Image
from google.colab.patches import cv2_imshow

预函数

这将清理文本以获得重要的名称、关键字等。下面的函数将删除停用词和重复词。

蟒蛇3

def pre(text):
    text = text.lower()
    tokenizer = RegexpTokenizer(r'\w+')
    new_words = tokenizer.tokenize(text)
    stop_words = list(stopwords.words("english"))
    filtered_words = []
      
    for w in new_words:
        if w not in stop_words:
            filtered_words.append(w)
    unique = []
  
    for w in filtered_words:
        if w not in unique:
            unique.append(w)
    res = ' '.join([str(elem) for elem in unique])
    res = res.lower()
      
    return res

to_df函数

当给定图像路径作为参数时,它返回文本变量中的预处理文本。然后将此文本作为参数传递给 pre()。此函数返回一个包含文件名和重要文本的字典。

Python

def to_df(imgno):
  text = pytesseract.image_to_string(imgno)
  out = pre(text)
  data = {'filename':imgno,
          'text':out}
  return data

驱动程序代码

在这里,我们定义了数据框来存储具有图像路径和图像内文本的字典。我们将使用此数据框进行搜索。

蟒蛇3



i=0
dff=pd.DataFrame()

列出内容文件夹中的所有图像。

蟒蛇3

images = []
folder = "/content/"
  
for filename in os.listdir(folder):
    img = cv2.imread(os.path.join(folder, filename))
      
    if img is not None:
        print(filename)
        images.append(filename)

获取所有图像

For 循环从文件夹中获取所有新闻图像。

蟒蛇3

for u in images:
  i += 1
  data = to_df(u)
  dff = dff.append(pd.DataFrame(data, index=[i]))
  
print(dff)

数据框

处理图像

蟒蛇3

# sample text output after processing image
dff.iloc[0]['text']

将数据框保存到数据库。

预处理后的示例文本

保存数据框

蟒蛇3

# saving the dataframe
dff.to_csv('save newsdf.csv')

保存的数据框

搜索

从存储中打开数据帧文件。



蟒蛇3

data = pd.read_csv('/content/save newsdf.csv')
data

从存储打开数据框

我们提供一个字符串作为函数的输入,以获取包含关键字的图像。

蟒蛇3

txt= 'modi'
index= data['text'].str.find(txt )
index

非 -1 行图像包含单词“modi”

显示结果

蟒蛇3

#  we are showing the first result here
for i in range(len(index)):
  
    if (index[i] != -1):
        a.append(i)
  
try:
    res = data.iloc[a[0]]['filename']
except:
    print("no file")
      
Image(res)

项目成果

我们搜索了“ modi ”这个词。第一份包含我们搜索词的报纸,因此显示在此处。

改进范围

我们可以使用专用数据库,例如 lucent 或 elasticsearch,使搜索更加高效和快速。但是暂时我们使用pandas库来获取图片的路径显示给用户。

项目在现实生活中的应用

  • 选民助手:随着选举的临近,阿曼是一名选民,他对他将要投票支持的政治家知之甚少。在这种情况下,他打开我们本地的 news.search.in,然后搜索政治家。该网站将显示与被搜索者相关的全国性报纸和地方性报纸的文章编号。现在他准备决定他的投票。
  • 学生研究变得简单:它对正在研究该主题的学生很有用,因为这将以图像形式提供所有报纸上与他们的主题相关的每篇文章,以便他们可以从中做笔记。
  • 报纸公司搜索引擎:它可用于新闻公司在其网站上具有搜索功能。