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 자연 언어 처리 라 이브 러 리 를 어떻게 사용 하여 비슷 한 텍스트 의 입력 을 받 아들 이 고 서로 비슷 하지 않 은 텍스트 로 돌아 가 는 지 설명 했다.
이런 사례 가 많 을 수 있 습 니 다.........................................................................................
파 이 썬 을 이용 하여 비슷 한 텍스트 를 걸 러 내 는 간단 한 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.파 이 썬 이 비슷 한 텍스트 를 걸 러 내 는 내용 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.