BM25를 사용한 클래식 토픽 모델링



이 문서는 AI 기반 시맨틱 검색 플랫폼인 txtai에 대한 자습서 시리즈의 일부입니다.

txtai은 머신 러닝 워크플로를 실행하여 데이터를 변환하고 AI 기반 시맨틱 검색 애플리케이션을 구축합니다.

txtai 5.0은 semantic graphs을 통해 토픽 모델링을 도입했습니다. 시맨틱 그래프는 임베딩 인스턴스에 쉽게 통합되어 주제 모델링을 txtai 인덱스에 추가할 수 있습니다.

변환기 지원 모델 외에도 txtai는 기존 인덱싱 방법도 지원합니다. txtai의 모듈식 설계를 고려할 때 BM25와 같은 기존 채점 방법을 그래프와 결합하여 주제 모델을 구축할 수 있습니다.

이 기사는 모두 CPU의 고전적인 Python 코드입니다. GPU나 기계 학습 모델이 필요하지 않습니다!

종속성 설치


txtai 및 모든 종속성을 설치합니다.

# Install txtai
pip install txtai[graph] datasets


데이터세트 로드



이 예에서는 뉴스 기사 헤드라인 모음인 ag_news 데이터 세트를 사용합니다.

from datasets import load_dataset

dataset = load_dataset("ag_news", split="train")


BM25 지수 구축



원래 txtai 릴리스 이후로 scoring 패키지가 있었습니다. 이 패키지는 독립 실행형 BM25, TF-IDF 및/또는 SIF 텍스트 인덱스 구축을 지원합니다.

from txtai.scoring import ScoringFactory

# List of all text elements
texts = dataset["text"]

# Build index
scoring = ScoringFactory.create({"method": "bm25", "terms": True})
scoring.index((x, text, None) for x, text in enumerate(texts))

# Show total
scoring.count()



120000


인덱스를 테스트해 봅시다.

for id, score in scoring.search("planets explore life earth", 3):
  print(id, texts[id], score)



16327 3 Planets Are Found Close in Size to Earth, Making Scientists Think 'Life' A trio of newly discovered worlds are much smaller than any other planets previously discovered outside of the solar system. 20.72295380862701
16158 Earth #39;s  #39;big brothers #39; floating around stars Washington - A new class of planets has been found orbiting stars besides our sun, in a possible giant leap forward in the search for Earth-like planets that might harbour life. 19.917461045326878
16620 New Planets could advance search for Life Astronomers in Europe and the United States have found two new planets about 20 times the size of Earth beyond the solar system. The discovery might be a giant leap forward in  19.917461045326878


결과는 예상대로 나타납니다. BM25는 키워드 기반 결과와 문맥 일치를 반환합니다.

토픽 모델 구축



이제 스코어링 인덱스가 있으므로 이를 사용하여 그래프를 작성합니다.

그래프에는 노드를 삽입하고 노드 간의 관계 인덱스를 작성하는 기본 제공 메서드가 있습니다. index 메소드는 (id, score) 쌍을 반환하는 모든 함수가 될 수 있는 검색 매개변수를 사용합니다. 이 로직은 임베딩 인스턴스에 내장되어 있습니다.

BM25 인덱스를 통해 구성된 그래프는 더 많은 리터럴 관계를 갖습니다. 즉, 키워드 기반이 될 것입니다. 임베딩으로 지원되는 시맨틱 그래프는 상황에 맞는 관계를 갖습니다.

다음 섹션에서는 주제 모델링을 지원하는 그래프를 작성합니다. 다중 처리 풀을 사용하여 CPU 사용량을 최대화합니다.

import os

from multiprocessing import Pool

from txtai.graph import GraphFactory

# Multiprocessing helper methods
SCORING = None

def create(search):
    global SCORING

    # Create a global scoring object
    SCORING = search

def run(params):
    query, limit = params
    return SCORING.search(query, limit)

def batchsearch(queries, limit):
    return pool.imap(run, [(query, limit) for query in queries])

# Build the graph
pool = None
with Pool(os.cpu_count(), initializer=create, initargs=(scoring,)) as pool:
    graph = GraphFactory.create({"topics": {}})
    graph.insert((x, text, None) for x, text in enumerate(texts))
    graph.index(batchsearch, None)


상위 10개 주제를 나열해 보겠습니다. 이 데이터 세트는 2004년부터입니다.

list(graph.topics)[:10]



['kerry_bush_john_president',
 'nhl_players_league_lockout',
 'arafat_yasser_palestinian_leader',
 'sharon_ariel_prime_minister',
 'blair_tony_minister_prime',
 'xp_windows_microsoft_sp2',
 'athens_gold_medal_olympic',
 'space_prize_million_spaceshipone',
 'nikkei_tokyo_reuters_average',
 'hostage_british_bigley_iraq']


주제는 주제 관련성에 따라 정렬된 각 일치하는 텍스트 요소의 ID 목록을 매핑합니다. 주제에 대해 가장 관련성이 높은 텍스트 요소를 인쇄해 보겠습니다.

uid = graph.topics["xp_windows_microsoft_sp2"][0]
graph.attribute(uid, "text")



Microsoft continues Windows XP SP2 distribution Continuing the roll-out of Windows XP Service Pack 2 (SP2), Microsoft Corp. on Wednesday began pushing the security-focused update to PCs running Windows XP Professional Edition 


그래프 분석



이것은 표준 txtai 그래프이므로 centrality 및 pagerank와 같은 분석 방법을 사용할 수 있습니다.

centrality = list(graph.centrality().keys())
print("Top connection count:", [len(graph.edges(uid)) for uid in centrality[:5]], "\n")

# Print most central node/topic
print("Most central node:", graph.attribute(centrality[0], "text"))

topic = graph.attribute(centrality[0], "topic")
for uid in graph.topics[topic][:3]:
  print("->", graph.attribute(uid, "text"))



Top connection count: [30, 30, 28, 28, 28] 

Most central node: Manning Gets Chance to Start Giants Coach Tom Coughlin announced that rookie quarterback Eli Manning will start ahead of two-time M.V.P. Kurt Warner in Thursday's preseason game against Carolina.
-> Manning Replaces Warner As Giants QB (AP) AP - Eli Manning has replaced Kurt Warner as the New York Giants' starting quarterback.
-> Eli Manning replaces Warner at quarterback Eli Manning, the top pick in this year #39;s NFL draft, has been named the starting quarterback of the New York Giants. Coach Tom Coughlin made the announcement at a Monday news conference.
-> Giants to Start Manning Against Carolina (AP) AP - Eli Manning is going to get a chance to open the season as the New York Giants' starting quarterback.


연결 수와 중심성 사이의 상관 관계에 주목하십시오.

BM25가 키워드 중심이라는 점을 감안할 때 가장 중심적인 노드는 본질적으로 중복되는 텍스트일 것으로 예상합니다. 그리고 그것은 여기의 경우입니다.

그래프를 걷다



시맨틱 그래프와 마찬가지로 관계 경로를 탐색할 수 있습니다.

from IPython.display import HTML

def showpath(source, target):
  path = graph.showpath(source, target)
  path = [graph.attribute(p, "text") for p in path]

  sections = []
  for x, p in enumerate(path):
    # Print start node
    sections.append(f"{x + 1}. {p}")

  return HTML("<br/><br/>".join(sections))



showpath(83978, 8107)



1. NFL Game Summary - NY Jets at Buffalo Orchard Park, NY (Sports Network) - Willis McGahee ran for 132 yards and a touchdown to lead the Buffalo Bills to a 22-17 victory over the New York Jets at Ralph Wilson Stadium.

2. NCAA Game Summary - Marshall at Georgia Athens, GA (Sports Network) - Michael Cooper ran for the only touchdown of the game, as third-ranked Georgia rode its defense to a 13-3 victory over Marshall at Sanford Stadium.

3. NCAA Game Summary - Northwestern at Wisconsin Madison, WI (Sports Network) - Anthony Davis ran for 122 yards and two touchdowns to lead No. 6 Wisconsin over Northwestern, 24-12, to celebrate Homecoming weekend at Camp Randall Stadium.

4. NCAA Top 25 Game Summary - Northwestern at Minnesota The last time Minnesota won four games to start three consecutive seasons was 1934-36...Chris Malleo replaced Basanez for two series in the third quarter for his first career appearance.

5. UConn ousts Marist Sophomore Steve Sealy netted his third winning goal in the last four games, giving Connecticut a 2-1 overtime victory over Marist yesterday in an NCAA Division 1 first-round men's soccer playoff game at Morrone Stadium in Storrs, Conn.

6. United States upsets Germany to move to soccer semifinals Deep into overtime, and maybe the last time for the Fab Five of US women #39;s soccer, the breaks were going against them. A last-gasp goal that stole victory in regulation, a wide-open shot that bounced off the goal post.


데이터가 시작 노드에서 끝 노드로 피봇되는 방식에 주목하십시오. Introducing the Semantic Graph 기사를 읽었다면 이 순회가 본질적으로 얼마나 문자 그대로인지 알게 될 것입니다. 즉, 관계는 키워드 중심 대 문맥입니다.

마무리



이 문서에서는 그래프가 BM25와 같은 기존 인덱스를 인덱싱할 수 있는 방법을 설명했습니다. 연결을 구축하기 위해 검색 기능을 사용할 수 있는 경우 이 방법을 외부 인덱스에도 적용할 수 있습니다.

임베딩 인스턴스가 지원하는 시맨틱 그래프에는 많은 이점이 있으며 대부분의 경우에 권장됩니다. 그러나 이것은 고전적인 방법입니다. 기계 학습 모델이 필요하지 않습니다!

좋은 웹페이지 즐겨찾기