Python 을 이용 하여 비슷 한 텍스트 를 걸 러 내 는 간단 한 방법 예시

문제.
만약 당신 이 압축 파일 에 수천 개의 문서 가 있다 고 가정 한다 면,그 중 많은 것 은 서로 중복 되 는 것 입 니 다.문서 의 내용 이 같 더 라 도 제목 이 다 릅 니 다.지금 상상 해 보 세 요.지금 사장 님 께 서 불필요 한 중복 문 서 를 삭제 함으로써 공간 을 풀 어 달라 고 하 십 니 다.
문 제 는 제목 이 비슷 한 텍스트 를 어떻게 걸 러 내 서 내용 이 같 을 수 있 습 니까?다음 에 이 목 표를 어떻게 실현 하여 작업 을 완성 할 때 너무 많은 문 서 를 삭제 하지 않 고 유일한 문 서 를 보존 할 수 있 습 니까?우 리 는 코드 를 사용 하여 그것 을 더욱 명확 하 게 합 시다.

titles = [
 "End of Year Review 2020",
 "2020 End of Year",
 "January Sales Projections",
 "Accounts 2017-2018",
 "Jan Sales Predictions"
]

# Desired output
filtered_titles = [
 "End of Year Review 2020",
 "January Sales Projections",
 "Accounts 2017-2018",
]
이상 의 문제 에 따라 본 고 는 이러한 문 제 를 어떻게 해결 하 는 지 신속 하고 실 용적 으로 개술 하고 그들 이 동시에 무엇 을 하 는 지 광범 위 하 게 이해 하고 자 하 는 사람들 에 게 적합 합 니 다!
이어서 나 는 내 가 이 문 제 를 해결 하기 위해 채택 한 다른 절 차 를 소개 할 것 이다.다음은 흐름 을 제어 하 는 개요 입 니 다.
모든 제목 텍스트 미리 처리
모든 제목 쌍 생 성
모든 쌍 의 유사 성 을 시험 하 다
한 쌍 의 텍스트 가 유사 성 테스트 를 통과 하지 못 하면 한 텍스트 를 삭제 하고 새 텍스트 목록 을 만 듭 니 다.
비슷 한 텍스트 가 남지 않 을 때 까지 이 새로운 비슷 한 텍스트 목록 을 계속 테스트 합 니 다.
Python 으로 표시 하면 재 귀 함수 에 잘 매 핑 될 수 있 습 니 다!
코드
다음은 Python 에서 이 기능 을 실현 하 는 두 함수 입 니 다.

import spacy
from itertools import combinations


# Set globals
nlp = spacy.load("en_core_web_md")

def pre_process(titles):
 """
 Pre-processes titles by removing stopwords and lemmatizing text.
 :param titles: list of strings, contains target titles,.
 :return: preprocessed_title_docs, list containing pre-processed titles.
 """

 # Preprocess all the titles
 title_docs = [nlp(x) for x in titles]
 preprocessed_title_docs = []
 lemmatized_tokens = []
 for title_doc in title_docs:
  for token in title_doc:
   if not token.is_stop:
    lemmatized_tokens.append(token.lemma_)
  preprocessed_title_docs.append(" ".join(lemmatized_tokens))
  del lemmatized_tokens[
   :
   ] # empty the lemmatized tokens list as the code moves onto a new title

 return preprocessed_title_docs

def similarity_filter(titles):
 """
 Recursively check if titles pass a similarity filter.
 :param titles: list of strings, contains titles.
 If the function finds titles that fail the similarity test, the above param will be the function output.
 :return: this method upon itself unless there are no similar titles; in that case the feed that was passed
 in is returned.
 """

 # Preprocess titles
 preprocessed_title_docs = pre_process(titles)

 # Remove similar titles
 all_summary_pairs = list(combinations(preprocessed_title_docs, 2))
 similar_titles = []
 for pair in all_summary_pairs:
  title1 = nlp(pair[0])
  title2 = nlp(pair[1])
  similarity = title1.similarity(title2)
  if similarity > 0.8:
   similar_titles.append(pair)

 titles_to_remove = []
 for a_title in similar_titles:
  # Get the index of the first title in the pair
  index_for_removal = preprocessed_title_docs.index(a_title[0])
  titles_to_remove.append(index_for_removal)

 # Get indices of similar titles and remove them
 similar_title_counts = set(titles_to_remove)
 similar_titles = [
  x[1] for x in enumerate(titles) if x[0] in similar_title_counts
 ]

 # Exit the recursion if there are no longer any similar titles
 if len(similar_title_counts) == 0:
  return titles

 # Continue the recursion if there are still titles to remove
 else:
  # Remove similar titles from the next input
  for title in similar_titles:
   idx = titles.index(title)
   titles.pop(idx)
   
  return similarity_filter(titles)

if __name__ == "__main__":
 your_title_list = ['title1', 'title2']
 similarty_filter(your_title_list)
첫 번 째 는 제목 텍스트 를 미리 처리 하 는 간단 한 함수 입 니 다.'the','a','and'와 같은 정지 어 를 삭제 하고 제목 에 있 는 단어의 인용 만 되 돌려 줍 니 다.
이 함수 에'End of Year Review 2020'을 입력 하면'end year review 2020'을 출력 으로 받 을 수 있 습 니 다."January Sales Projections"를 입력 하면"january sale projection"을 받 을 수 있 습 니 다.
python 에서 사용 하기 쉬 운 spacy 라 이브 러 리 를 주로 사용 합 니 다.
두 번 째 함수(30 줄)는 모든 제목 에 짝 짓 기 를 만 든 다음 코사인 싱크로 율 테스트 를 통 과 했 는 지 확인 합 니 다.비슷 한 제목 을 찾 지 못 하면 비슷 하지 않 은 제목 의 목록 을 출력 합 니 다.그러나 비슷 한 제목 을 찾 았 다 면 싱크로 율 테스트 를 통과 하지 못 한 짝 짓 기 를 삭제 한 후 이 걸 러 낸 제목 을 다시 자신 에 게 보 내 고 비슷 한 제목 이 있 는 지 확인 합 니 다.
이것 이 바로 왜 그것 이 재 귀 하 는 것 입 니까?간단명료 합 니 다.이것 은 함수 가 출력 을 계속 검사 하여'최종'출력 으로 돌아 가기 전에 유사 한 제목 이 없 는 지 확인 하 는 것 을 의미 합 니 다.
코사인 싱크로 율 이란 무엇 입 니까?
요컨대 이것 이 바로 spacy 가 뒤에서 한 일 입 니 다.
우선,미리 처 리 했 던 일 들 을 기억 하 십 니까?우선,spacy 는 우리 가 입력 한 단 어 를 하나의 디지털 행렬 로 만 들 었 다.
일단 그것 이 완성 되면,너 는 이 숫자 들 을 벡터 로 바 꿀 수 있다.즉,너 는 그것들 을 그림 에 그 릴 수 있다 는 것 이다.
일단 네가 이렇게 한다 면,두 직선 협각 의 여현 을 계산 하면 그것들 이 같은 방향 을 가리 키 는 지 아 닌 지 를 알 수 있 을 것 이다.

그래서 위의 그림 에서 A 선 은'반 짝 이 는 오렌지색 과일',B 선 은'반 짝 이 는 빨 간 사 과 는 일종 의 과일'이 라 고 상상 해 보 세 요.
이러한 상황 에서 행 A 와 행 B 는 모두 이 두 문장 을 위 한 빈 칸 에 대응 하 는 디지털 행렬 이다.이 두 선 사이 의 각 도 는 위의 도표 에서 그리스 자모 theta 가 표시 하 는 것 이 매우 유용 하 다!너 는 코사인 을 계산 해서 이 두 선 이 같은 방향 을 가리 키 는 지 아 닌 지 를 판단 할 수 있다.
이것 은 분명히 알 수 있 고 계산 하기 어 려 운 것 처럼 들 리 지만 관건 은 이런 방법 이 우리 에 게 전체 과정 을 자동화 하 는 방법 을 제공 하 는 것 이다.
총결산
돌 이 켜 보면 python 함수 가 코사인 유사 성과 spacy 자연 언어 처리 라 이브 러 리 를 어떻게 사용 하여 비슷 한 텍스트 의 입력 을 받 아들 이 고 서로 비슷 하지 않 은 텍스트 로 돌아 가 는 지 설명 했다.
이런 사례 가 많 을 수 있 습 니 다.........................................................................................
파 이 썬 을 이용 하여 비슷 한 텍스트 를 걸 러 내 는 간단 한 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.파 이 썬 이 비슷 한 텍스트 를 걸 러 내 는 내용 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기