KR20200018469A - 데이터 압축 및 분석을 위한 컴퓨터화된 방법 - Google Patents

데이터 압축 및 분석을 위한 컴퓨터화된 방법 Download PDF

Info

Publication number
KR20200018469A
KR20200018469A KR1020197037620A KR20197037620A KR20200018469A KR 20200018469 A KR20200018469 A KR 20200018469A KR 1020197037620 A KR1020197037620 A KR 1020197037620A KR 20197037620 A KR20197037620 A KR 20197037620A KR 20200018469 A KR20200018469 A KR 20200018469A
Authority
KR
South Korea
Prior art keywords
cells
symbol
document
replacement
range
Prior art date
Application number
KR1020197037620A
Other languages
English (en)
Inventor
타카시 스즈키
Original Assignee
타카시 스즈키
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 타카시 스즈키 filed Critical 타카시 스즈키
Publication of KR20200018469A publication Critical patent/KR20200018469A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • G06F16/17Details of further file system functions
    • G06F16/174Redundancy elimination performed by the file system
    • G06F16/1744Redundancy elimination performed by the file system using compression, e.g. sparse files
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • G06F16/2246Trees, e.g. B+trees
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/951Indexing; Web crawling techniques
    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/3084Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction using adaptive string matching, e.g. the Lempel-Ziv method
    • H03M7/3088Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction using adaptive string matching, e.g. the Lempel-Ziv method employing the use of a dictionary, e.g. LZ78
    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/40Conversion to or from variable length codes, e.g. Shannon-Fano code, Huffman code, Morse code
    • H03M7/4031Fixed length to variable length coding
    • H03M7/4037Prefix coding
    • H03M7/4043Adaptive prefix coding
    • H03M7/4062Coding table adaptation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/40Conversion to or from variable length codes, e.g. Shannon-Fano code, Huffman code, Morse code
    • H03M7/4031Fixed length to variable length coding
    • H03M7/4037Prefix coding
    • H03M7/4043Adaptive prefix coding
    • H03M7/4056Coding table selection
    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/60General implementation details not specific to a particular type of compression
    • H03M7/6017Methods or arrangements to increase the throughput

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Document Processing Apparatus (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Abstract

컴퓨터화된 방법 및 장치는 심볼 정보, 가령, 텍스트를 압축한다. 심볼 정보는 재귀적으로 심볼의 쌍(가령, 단어 또는 캐릭터의 쌍)을 식별하고 각각의 쌍을 각자의 대체 심볼로 대체함으로써 압축된다. 비압축 텍스트에서 각각의 심볼 쌍이 등장하는 횟수가 카운트되며, 임계 횟수보다 많이 등장하는 경우에만 쌍이 대체된다. 재귀적 패스에서, 각각의 대체된 쌍이 이전에 치환된 대체 심볼을 포함할 수 있다. 방법 및 장치는 큰 데이터세트에서 특히 높은 압축을 달성할 수 있다. 문서의 압축 동안 생성되는 메타데이터, 가령, 각각의 쌍이 등장하는 횟수가 사용되어 문서들을 분석하고 두 문서들 간 유사성을 찾을 수 있다.

Description

데이터 압축 및 분석을 위한 컴퓨터화된 방법
본 발명의 분야는 데이터 압축 및 분석과 관련된다. 구체적으로, 본 발명은 심볼로 표현될 수 있는 텍스트 및 그 밖의 다른 정보의 무손실 압축과 관련된다.
이전 텍스트 압축 기법은 한 번에 하나의 파일 또는 문서에서만 이용 가능하다. 이러한 기법은 거대한 데이터 세트, 즉, "빅 데이터(Big Data)" 또는 데이터가 여러 다른 컨테이너에 걸쳐 확산되는 경우에는 쉽게 확장되지 않는다. 또한 이전 기법은 비압축 텍스트에서 특정 심볼 또는 심볼 스트링이 등장하는 횟수를 추적하지 않는다. 특정 심볼 또는 스트링이 등장하는 횟수는 공간 절약을 향상하고, 처리 시간을 감소시키며, 맥락 분석을 실시하는 데 유용한 귀중한 정보이다.
실시예는 복수의 문서로 구성되는 심볼 정보를 압축한다. 비압축 문서 각각은 복수의 심볼을 가진다. 문서는 임의의 길이의 심볼의 스트링(가령, 문장, 문단, 또는 텍스트 파일)일 수 있다. 심볼은 정보를 구성 또는 담고 있는 임의의 코드(가령, 문자, 숫자, 비-문숫자 캐릭터, 음절 또는 단어)일 수 있다.
실시예에서 문서 내 2개의 인접 심볼들을 심볼 쌍으로서 식별함으로써 입력 문자가 다뤄진다. 실시예에서, 각각의 고유 신볼 쌍이 압축 딕셔너리에 저장된다. 압축 딕셔너리는 각각의 저장된 심볼 쌍을 각자의 대체 심볼과 연관시킨다. 실시예에서, 또한 각각의 고유 심볼 쌍이 입력 문서에서 등장하는 횟수의 카운트가 유지된다. 실시예에서, 심볼 쌍에 대한 카운트가 임계값을 초과하는 경우 심볼 쌍을 각자의 연관된 대체 심볼을 대체함으로써 압축된 출력 문서가 생성된다.
일부 실시예가 출력 문서를 추가 패스를 위한 입력 문서로서 이용함으로써 압축 프로세스를 반복하도록 프로그램된다. 특정 실시예에서, 추가 대체가 이뤄질 수 없을 때까지 추가 패스가 재귀적으로 수행된다(즉, 최종 패스에서, 출력 문서는 입력 문서와 동일하다). 재귀적 패스에서 식별되는 심볼 쌍이 이전 패스로부터의 대체 심볼을 포함할 수 있다.
일부 실시예는 복수의 문서에 적용되도록 프로그램된다. 실제로, 압축 비가 비압축 데이터의 크기가 증가할수록 개선된다. 데이터 세트가 클수록, 임의의 특정 심볼 쌍과 연관된 카운트가 임계값을 초과할 가능성이 더 높고, 이는 더 높은 대체율 및 더 높은 압축율을 야기한다. 이들 실시예 중 일부에서, 어떠한 추가 대체도 가능하지 않을 때까지 모든 문서에서 프로세스가 반복될 때 압축이 최적화된다.
일부 실시예는 대체 심볼로서, 압축 딕셔너리 내 대체된 심볼 쌍의 주소를 이용함으로써, 공간 절약을 향상시키고 압축 딕셔너리를 액세스하는 데 필요한 룩업 시간을 감소시킨다.
일부 실시예에서, 심볼 쌍이 등장하는 횟수의 카운트를 기초로 압축 딕셔너리 내 항목이 정렬된다. 정렬은 더 액세스 가능한 메모리 위치에 덜 빈번하게 등장하는 심볼 쌍보다 더 자주 등장하는 심볼 쌍을 배치하도록 이뤄진다. 정렬은 대체 단계 동안 룩업 시간을 감소시킨다.
일부 실시예는 대체 심볼의 패턴 및 등장하는 횟수의 카운트를 이용해 특정 심볼 쌍이 콘텐츠를 분석할 수 있다.
데이터 압축 및 분석의 컴퓨터화된 방법과 관련된 목적 및 이점이 도면에서 도시되고 이하에서 기재된 실시예를 참조하여 자명해질 것이다.
이 간단한 설명은 이하에서 더 상세히 기재될 개념들의 모음을 단순화시켜 소개하려 제공된 것이다. 이 간단한 설명은 청구되는 주제 사항의 핵심 또는 본질적 특징을 식별하거나 청구되는 주제 사항의 범위를 결정하려 사용되지 않는다.
도 1은 하나의 실시예에서 적용되는 텍스트 표준화 프로세스의 시각적 표현이다.
도 2는 도 1의 실시예에서 사용되는 압축 딕셔너리의 시각적 표현이다.
도 3은 도 2의 실시예의 시각적 표현 동작이다.
도 4는 도 2의 실시예의 동작을 보여주는 흐름도이다.
도 5는 실험 실시예에 의해 얻어진 결과를 보여주는 차트이다.
도시된 실시예는 개략적으로 나타난다. 도시된 실시예는 예시에 불과하며, 본 개시 내용 또는 첨부된 청구항의 범위를 한정하는 것으로 해석되지 않아야 한다.
데이터 압축 및 분석 기법의 실시예가 컴퓨터 명령의 세트로서 컴퓨터 코드로 프로그램될 수 있다. 컴퓨터 상에서 실행될 때, 컴퓨터 명령이 컴퓨터 프로세서를 제어하고 컴퓨터 프로세서가 본 명세서에 기재된 기능을 수행할 수 있게 한다. 컴퓨터 명령(가령, 컴퓨터 소프트웨어)이 컴퓨터에 의해 액세스 가능하거나 컴퓨터 파드웨어로 인코딩되는 임의의 컴퓨터 메모리에 저장될 수 있다. 일부 실시예가 특수 목적 컴퓨터 또는 전용 컴퓨터 기구에서 인스턴스화된다. 실시예에서 다뤄지는 문서가 컴퓨터 시스템에 의해 액세스 가능한 동일하거나 상이한 컴퓨터 메모리에 저장될 수 있다.
실시예에서 비압축 텍스트가 분석되어 심볼의 인접 쌍이 식별될 수 있다. 실시예에서 지정 횟수보다 많이 등장하는 심볼의 쌍의 등장이 이와 연관된 대체 심볼로 대체된다. 심볼은 문숫자 캐릭터, 개별 문숫자 캐릭터 그룹, 가령, 음절 또는 단어, 또는 정보를 구성하고 담고 있는 임의의 코드일 수 있다.
일부 실시예에서, 예비 단계 동안 비압축 텍스트 내 원본 심볼이 표준 심볼로 대체된다. 도 1은 실시예가 비압축 텍스트를 표준화하는 방식을 나타낸다. 특정 환경에서, 가령, 원본 심볼의 길이에 큰 변동이 있을 때, 표준화가 후속 동작 동안의 성능을 개선한다.
도 1의 실시예에서 고유 원본 심볼의 모든 등장이 식별되고 카운팅되며 각각의 고유 원본 심볼이 저장된다. 각각의 원본 심볼이 표준 심볼과 연관되어 표준화 메모리에 저장된다. 도 1에서, 표준화 메모리(140)는 원본 심볼(열(160))을 이의 각자의 표준 심볼(열(150)) 및 각각의 원본 심볼이 비압축 텍스트에서 등장하는 횟수의 카운트(열(70))와 연관시킨다.
고유의 원본 심볼을 식별하기 위해, 일부 실시예가 특정 비-문숫자 캐릭터(가령, 공백)을 두 개의 심볼 간 구분을 나타내는 것으로 프로그램된다. 실시예에서 공백을 심볼들 간 구분으로 해석되지만 표준화된 문서에서 공백이 유지된다. 예를 들어, 문서(111)는 표준 심볼을 분리하는 공백을 갖는 것으로 도시된다. 그러나 또 다른 실시예에서 공백 및 그 밖의 다른 특정 비-문숫자 캐릭터가 전체적으로 폐기되는데, 이러한 캐릭터의 위치가 복구되거나 문맥상 알 수 있기 때문이다. 예를 들어, 심볼들 간 공백이 원본 심볼을 식별하는 데 사용되는 알고리즘의 규칙을 기초로 추론 및 재생될 수 있다. 마찬가지로, 특정 비-문숫자 캐릭터의 존재가 텍스트가 작성된 언어의 문법을 기초로 추론될 수 있다.
일부 실시예에서 특정 비-문숫자 캐릭터가 심볼의 일부로서 해석된다. 도 1의 실시예가 어퍼스트로피를 포함할지라도 텍스트(105)를 심볼로 식별했다. 또 다른 실시예가 비-문숫자 캐릭터를 오른쪽에서 심볼로 식별한다.
일부 실시예는 심볼을 처리하는 동안 대문자를 무시한다. 이러한 실시예는 모든 원본 심볼의 균일한 대소문자 버전(가령, 소문자 버전)만 저장함으로써 공간 절약을 제공한다. 이러한 실시예는 문장 구조 및 고유 명사에 관한 문법 및 맥락적 규칙을 이용해 대문자를 복구하는 것을 포함해 원본 텍스트를 복구할 수 있다.
일부 실시예는 선택 심볼을 문서의 종료 시그널링하는 것으로 해석한다. 도 1의 실시예가 마침표(107)를 문서(101)와 문서(102) 간 분리자로서 식별한다. 대안 실시예가 캐리지 리턴(carriage return), 문단, 셀, 필드, 레코드, 행, 열, 페이지, 제목, 마크업 언어의 태그, 콘텐츠 테이블의 정보, 또는 섹션 또는 챕터 마킹을 기초로 텍스트를 문서로 분리한다. 임의의 인간이 이해할 수 있거나 컴퓨터로 판독할 수 있는 마커 또는 컨테이너가 사용되어 텍스트를 문서로 분할할 수 있다. 또 다른 실시예가 개별 컴퓨터 파일인 문서를 조작한다.
실시예는 복수의 문서를 동시에 조작한다. 따라서 표준화 프로세스 동안, 실시예가 문서 내 임의의 원본 심볼을 대체하기 전에 모든 문서에서의 고유의 비압축 심볼의 모든 등장을 식별하고 카운팅한다.
실시예는 문서(101)의 원본 심볼을 표준화 메모리(140)에 저장된 표준 심볼로 대체하여, 표준화된 문서(111)를 생성할 수 있다. 표준화 메모리(140)는 입력 문서의 표준화 동안 생성되거나 이미 존재할 수 있다. 도 1은 행-열 포맷으로 표준화 메모리(140)를 제공하지만, 그 밖의 다른 데이터 저장 구조가 사용될 수 있다.
실시예는 열(170)에 저장된 카운트에 따라 표준화 메모리(140) 내 항목을 정렬한다. 실시예는 표준 심볼이 배정되고 열(150)에 저장되기 전에 항목을 정렬한다. 표준화 메모리(140)를 정렬하는 것은 실시예가 더 짧은 표준 심볼을 가장 빈번하게 등장하는 심볼에 배정할 수 있기 때문에 공간 절약을 향상시킨다. 또한 정렬에 의해, 빈번하게 사용되는 표준 심볼이 자주 액세스 가능한 메모리 위치에 저장될 수 있으며, 이는 룩업 시간을 개선한다. 정렬 후, 일부 실시예는 공간을 절약하기 위해 카운트를 삭제할 수 있다.
도 1은 표준화 메모리(140)의 열(170)에 저장된 카운트를 보여준다. 대안 실시예가 표준화 동안 생성된 카운트를 표준화 메모리에서 분리하여 저장한다.
표준 심볼이 표준화 메모리(140) 내 원본 심볼의 위치를 가리키는 주소일 수 있다. 임의의 심볼 대신 주소를 사용하는 것이 불필요한 심볼을 저장할 어떠한 필요성도 없기 때문에 요구되는 메모리 공간을 감소시킨다. 표준 심볼로서 주소를 이용하는 것이 또한 실시예가 표준 심볼 및 대체 심볼 간 번역을 필요로 하는 복수 번 룩업을 수행하는 것이 아니라 단일 메모리 룩업만 사용할 필요가 있기 때문에 대체 및 압축해제 동안의 프로세싱 시간을 개선한다. 텍스트를 이의 본래 평태로 복구할 때, 각각의 표준 심볼이 실시예를 원본 심볼의 정확한 메모리 위치로 지향시킨다.
정렬 후 적용될 때 표준 심볼로서 주소를 이용하는 것은, 더 빈번하게 등장하는 심볼이 덜 빈번하게 등장하는 심볼보다 더 액세스 가능한 메모리 위치에 저장됨을 보장하기 때문에, 룩업 시간을 더 개선한다.
도 2는 실시예에서, 고유 심볼 쌍을 이의 대체 심볼 간 연관관계를 저장하기 위해 사용되는 압축 사전(200)의 표현이다. 도 1의 표준화 메모리(140)는 도 2의 압축 딕셔너리(compression dictionary)(200)와 별개로 저장된다. 대안 실시예가 압축 딕셔너리의 일부로서 표준화 메모리를 저장할 수 있다.
압축 딕셔너리(200)는 행 및 열로 구조화된다. 대안 실시예에서 그 밖의 다른 데이터 구조, 가령, 관계 데이터베이스, 문서-지향적 데이터베이스, 그래프 데이터베이스, 키-값 저장, 객체 데이터베이스, 또는 계층 트리를 이용해 압축 딕셔너리(및 사용되는 경우 표준화 메모리)를 유지할 수 있다. 일부 실시예에서, 기존 압축 딕셔너리가 사용된다. 또 다른 실시예에서, 동작 동안 압축 딕셔너리가 생성된다.
도 3은 도 2의 실시예에서 다뤄지는 문서(111)의 표현이다. 실시예는 압축이 완료될 때까지, 가령, 어떠한 추가 심볼 쌍도 대체를 위한 임계값을 만족하지 않을 때까지 재귀적으로 반복되도록 프로그램된다. 실시예는 문서(111)를 조작하여 출력 문서(351)를 생성할 수 있다. 숫자(321, 331, 및 341)가 재귀적 실시예에 의해 수행되는 프로세스의 패스 전 중간 결과를 가리키며, 이들은 여기서 참조의 편의를 위해 "문서"라고 불리지만 다음 패스 동안 삭제되거나 덮어 써질 수 있다. 마찬가지로 문서(112-114)는 문서(111)와 동일한 배치(batch)에서 처리되어, 각각의 문서(352-354)를 생성할 수 있다. 문서(322-324, 332-334, 및 342-344)가 패스들 사이의 중간 결과를 나타낸다.
각각의 패스 동안 실시예가 문서를 통과하며, 실시예는 각각의 고유한 심볼 쌍의 등장을 식별 및 카운트하고("카탈로징 단계(cataloging phase)") 심볼 쌍을 대체 임계값을 초과하는 카운트로 대체한다("대체 단계(replacement phase)"). 실시예는 대체 단계로 복귀하기 전에 모든 문서에 카탈로징 단계를 수행한다.
대안 실시예가 각각의 문서의 텍스트를 순차로 처리함으로써 하나의 작업으로 심볼 쌍을 식별 및 대체한다. 이러한 대안 실시예에서, 문서의 패스가 각각의 순차적 심볼 쌍을 압축 딕셔너리의 항목에 비교하는 것을 포함한다. 비교가 매칭을 도출하는 경우, 비교되는 심볼 쌍의 카운트가 증분되고, 대체 임계값이 충족되는 경우, 심볼 쌍이 대체 심볼로 대체된다. 비교가 매칭을 생성하지 않는 경우, 심볼 쌍이 고유한 것으로 식별되고 압축 딕셔너리에 추가된다. 이러한 대안 실시예가 심볼 쌍의 카운트가 대체를 위한 임계값을 초과할 때까지 대체 심볼을 사용하지 않기 때문에, 이러한 실시예가 심볼 쌍의 카운트가 대체 임계값을 초과하면 심볼 쌍의 이전 인스턴스의 대체를 스케줄링한다.
패스의 식별 또는 카탈로징 단계에서, 실시예는 문서의 마지막 심볼에 도달할 때까지 문서에서 각각의 심볼을 다음 인접한 심볼과 페어링함으로써 입력 문서에서 심볼 쌍을 식별한다. 따라서 첫번째와 마지막 심볼을 제외한 모든 심볼이 다음의 두 개의 심볼 쌍에 포함된다: 심볼이 이전 심볼과 페어링됨으로써 형성된 하나의 심볼 쌍, 및 심볼이 다음 심볼과 페어링됨으로써 형성된 하나의 심볼 쌍.
예를 들어, 문서(111)를 처리할 때, 실시예는 심볼(311 및 312)을 제1 쌍으로 인식하고 심볼(312 및 313)을 제2 쌍으로 인식한다. 실시예는 심볼(318 및 319)을 페어링할 때까지 심볼들을 계속 페어링한다. 첫번째 심볼(심볼(311))과 마지막 심볼(심볼(319))은 서로 하나의 심볼(즉, 각각 심볼(312) 및 심볼(318))과만 페어링된다. 문서의 나머지 모든 심볼이 두 개의 심볼 쌍에 포함된다.
대안 실시예에서, 인접 문자의 모든 가능한 페어링를 비교하지 않는다. 오히려 이러한 실시예에서는 이전에 비교된 쌍으로부터의 심볼을 갖는 심볼 쌍이 스킵된다. 예를 들어, 이러한 실시예는, 문서(111)를 조작할 때, 심볼(311 및 312)의 쌍을 인식하고, 심볼(312 및 313)에 의해 형성된 쌍을 스킵하며, 심볼(313 및 314)의 쌍을 다음 쌍으로 인식할 것이다.
모든 페어링이 문서(111-114)에서 심볼에 대해 이뤄지면, 실시예가 각각의 고유 심볼 쌍이 문서에서 등장하는 횟수를 카운트한다. 실시예가 매 심볼 쌍을 어레이로 삽입하고 어레이에 "피봇 테이블" 작업을 수행하여, 각각의 고유 심볼 쌍의 등장 횟수를 식별 및 카운트함으로써, 고유 심볼 쌍을 식별 및 카운트한다.
각각의 패스에서, 실시예가 압축 딕셔너리에서 패스-관련 섹션을 생성한다. 예를 들어, 도 2를 참조하면, 압축 딕셔너리(200)의 열(210 및 211)이 제1 패스의 카탈로징 단계의 결과이다. 열(210)은 제1 패스의 카탈로징 단계에서 처리되는 텍스트로부터 각각 고유 심볼 쌍을 저장한다. 열(211)은 각각의 심볼과 연관된 카운트를 저장한다.
도 2는 압축 딕셔너리(200)에 필드로서 저장되는 카운트를 제공한다. 심볼 쌍의 연관된 카운트가 압축 딕셔너리의 항목으로서가 아니라 심볼 쌍의 속성 또는 메타데이터로서 저장될 수 있다. 대안 실시예는 각각의 쌍과 연관된 카운트를 압축 딕셔너리와 별개로 저장한다. 실시예는 단 한 번만 등장한 심볼 쌍에 대한 카운트를 저장하지 않는다(압축 딕셔너리(200)의 항목(216)을 참조). 심볼 쌍의 존재가 이러한 심볼 쌍이 단 한 번 등장했음을 가리키는 데 충분하다.
실시예는 심볼의 표준화와 관련하여 앞서 기재된 것과 유사한 방식으로 각각의 심볼 쌍의 카운트를 기초로 압축 딕셔너리(200)의 항목을 정렬하도록 프로그램된다. 다시 말하면, 모든 심볼 쌍이 문서(111-114)로부터 식별된 후, 실시예는 대체 심볼을 할당하거나 문서(321)를 생성하기 위한 임의의 대체를 수행하기(도 3) 전 압축 딕셔너리(200)의 항목을 정렬한다(도 2). 표준화 메모리를 정렬하는 것과 관련하여 앞서 기재된 바와 유사한 이유로, 실시예는 압축 딕셔너리(200)를 정렬함으로써 공간 절약 및 수행 이점을 얻는다.
대체 심볼은 대체 심볼과 연관된 심볼 쌍이 정렬되는 압축 딕셔너리 내 주소일 수 있다. 도 2의 실시예에서, 대체 심볼은 행 식별자(열(201) 참조)와 열 식별자의 조합으로부터 형성된다. 열 식별자는 심볼 쌍이 식별되는 패스를 지시한다(도 2의 P1, P2, P3). 주소-기반 대체 심볼의 사용이 유사한 이유로 표준화와 관련하여 앞서 기재된 것과 유사한 이점을 제공한다. 대안 실시예는 심볼 쌍의 주소와 관련 없는 고유 대체 심볼을 할당한다.
일부 경우, 대체 심볼은 행 식별자와 연관된 주소의 일부분일 수 있다. 예를 들어, 실시예의 제1 패스로부터의 대체 심볼이 각자의 심볼 쌍의 주소의 행 식별자에 불과하다. 실시예가 문서를 압축해제할 때, 패스 식별자(pass identifier) 없는 대체 심볼을 제1 패스로부터 온 것으로 연관시키는 것이 프로그램된다. 실시예에서, 제1 패스로부터의 대체 심볼이 출력 문서에 삽입되고 (순차 패스에서 또 다른 심볼과 페어링되는 경우) 패스 식별자 없이 압축 딕셔너리에 저장된다.
대안 실시예가 유사한 방식으로 추가 공간 절약을 달성한다. 제1 패스 후 임의의 주어진 패스에 대해, 실시예는 또 다른 심볼과 가장 빈번하게 페어링되는 대체 심볼의 패스 식별자를 생략할 수 있다. 예를 들어, 패스 X에서, 패스 1, …, N, … X-1 중 임의의 패스로부터의 대체 심볼을 또 다른 심볼과 페어링함으로써, 심볼 쌍이 형성될 수 있다. 패스 X에서 패스 N의 대체 심볼이 다른 심볼과 가장 자주 페어링된다고 가정한다. 이 경우, 패스 N에 대한 전체 대체 심볼을 압축 딕셔너리에 저장하기 보다는, 실시예가 패스 N 대체 심볼로부터의 패스 식별자를 생략하고 패스 N이 패스 X 에 대한 가장 빈번한 페어링이라는 지시자를 저장한다. 따라서 압축 딕셔너리의 패스 X의 섹션에 저장된 임의의 심볼 쌍이 패스 식별자가 없는 대체 심볼을 포함하는 경우, 패스 식별자는 패스 N의 것이라고 추측된다. 이러한 방식으로, 패스 N의 패스 식별자가 패스 X 동안 압축 딕셔너리에 저장된 모든 항목에 대해 한 번만 저장될 필요가 있기 때문에, 공간이 절약된다.
도 2의 실시예는 연관된 카운트가 지정 임계값을 초과하는 경우 대체 심볼만 이용한다. 압축 딕셔너리 내 항목에 대응하는 문서 내 모든 심볼 쌍이 대체될 수 있다(가령, 임계 값이 1과 동일). 그러나 높은 임계값일수록 개선된 성능을 가능하게 한다. 많은 수의 심볼 쌍이 단 한번 또는 몇 번만 나타나는 경우, 대체는 문서의 압축을 개선하거나 실질적으로 개선하지 않을 것이며 압축 딕셔너리의 저장 요건을 증가시킬 것이다. 높은 임계값일수록 드물게 사용되는 심볼 쌍을 대체할 필요성을 제거함으로써 처리 시간을 감소시킬 수 있다.
실시예는 임계값을 초과하는 카운트를 갖는 심볼 쌍에 대한 압축 딕셔너리 항목만 유지함으로써 공간 절약을 더 개선한다. 실시예가 대체 단계를 시작하기 전에 모든 문서에 대한 카탈로징 단계를 수행하도록 프로그램되기 때문에, 임계값을 초과하지 않는 심볼 쌍은 대체되지 않을 것이다. 따라서 임계값 미만 심볼 쌍을 저장하는 것이 어떠한 이점도 없이 압축 딕셔너리의 크기를 증가시킨다. 이러한 비효율을 피하기 위해, 실시예가 임계값보다 작은 카운트를 갖는 항목을 갖는 압축 딕셔너리를 잘라낸다(즉, 일부분을 삭제). 예를 들어, 제1 패스에 대한 임계값이 4인 경우, 실시예는 도 2의 부분(260)을 유지하지 않을 것이다.
대안 실시예가 임계값보다 낮은 카운트를 갖는 항목이 있는 압축 딕셔너리의 부분이 문서의 현재 세트에서 사용되지 않을 것이지만 이를 유지한다. 새 문서가 문서의 세트가 추가되는 경우, 임계값 미만 심볼 쌍에 대한 카운트가 대체 임계치를 충족하는 포인트까지 증가할 수 있다. 일부 대안 실시예가 압축 딕셔너리가 아닌 별도의 아카이브에 압축 딕셔너리의 임계값 미만 부분을 저장한다. 상기 아카이브는 새로운 문서가 추가될 때 액세스될 수 있다.
다양한 실시예에서, 심볼 쌍이 최초로 식별되거나 대체 임계값을 충족할 때 대체 심볼이 심볼 쌍과 연관될 수 있다. 실시예가 가장 빈번하게 사용된 대체 심볼이 최단 길이를 가질 것이며 가장 액세스 가능한 메모리 위치에 배치될 수 있도록 정렬과 잘라내기 후에 대체 심볼을 할당한다. 대체 심볼이 자신의 연관된 심볼 쌍의 주소인 경우, 정렬 순서(sort order) 내 심볼 쌍의 위치를 이용해, 각각의 대체 심볼은 자신의 심볼 쌍과 연관된다.
대안 실시예가 대체 단계가 시작하기 전 어느 때라도 대체 심볼을 할당할 수 있다. 이러한 대안 실시예는 카운트를 기초로 압축 딕셔너리를 정렬하거나 항목을 이의 본래 순서로 유지할 수 있다. 정렬 후, 일부 실시예는 추가 공간을 절약하기 위해 카운트를 삭제한다.
패스의 대체 스테이지 동안, 실시예는 입력 문서 내 심볼 쌍을 압축 딕셔너리(200)로부터의 대체 심볼로 대체함으로써 압축된 출력 문서를 생성한다. 대안 실시예가 원본 심볼의 쌍 자리에 원본 심볼 또는 대체 심볼을 삽입함으로써 입력 문서와 구별되는 새로운 출력 문서를 생성한다. 이러한 대안 실시예는 나중에 입력 문서를 삭제한다. 실시예는 입력 문서(111) 내 심볼 쌍을 대체 심볼로 적절하게 덮어씀으로써 출력 문서(321)를 생성한다(도 3).
임계값을 초과하지 않는 카운트를 갖는 항목이 유지되지 않기 때문에 실시예에 대한 압축 딕셔너리는 대체 임계값을 초과하는 심볼 쌍에 대한 항목만 포함한다. 따라서 실시예는 압축 딕셔너리 내 항목과 매칭되는 제1 심볼 쌍을 대체하도록 프로그램된다. 문서(111)를 처리할 때, 실시예는 심볼(311 및 312)(도 3)의 쌍을 식별하고 이를 합축 딕셔너리(200)(도 2)의 항목에 비교한다. 심볼(311 및 312)의 쌍이 압축 딕셔너리(200)(항목(212) 참조)에서 발견된다. 매칭이 발견되기 때문에, 심볼(311 및 312)의 쌍이 출력 문서(321)에서 대체 심볼(325)로 대체된다. 딕셔너리가 또한 심볼(312 및 313)의 쌍을 포함하며(214 참조), 카운트가 대체를 위한 임계값을 초과한다(215 참조). 그러나 실시예가 심볼(312)을 이미 대체했기 때문에 심볼(312 및 313)의 쌍이 대체를 위해 고려되지 않는다.
압축 딕셔너리를 잘라내지 않는 실시예는 문서 내 심볼 쌍을 압축 딕셔너리에 비교해야 하고 또한 대체 전에 카운트를 체크해야 한다. 대안 실시예가 복수의 가능한 대체를 분석하여 어느 것이 총 대체 개수를 최대화하거나 공간 절약을 최대화하는지를 결정할 수 있다. 또 다른 실시예가 대체 쌍의 길이 또는 문서를 압축해제하는 데 필요한 룩업 시간의 최대화를 기초로 대체할 쌍을 결정한다. 또 다른 대안 실시예가 제1 심볼 쌍을 대체하려 시도하고 어떠한 대체도 없는 경우, 제1 쌍의 제2 심볼을 다음 순차 심볼과 조합함으로써 형성될 수 있는 쌍을 스킵한다.
실시예가 심볼 쌍을 대체할 수 없을 때, 다음 심볼 쌍을 계속 고려한다. 예를 들어, 심볼(315 및 316)의 쌍이 압축 딕셔너리 내 항목에 비교될 때, 어떠한 매칭도 발견되지 않는다. 따라서 실시예는 다음 심볼 쌍(심볼(316 및 317)의 쌍)으로 진행한다. 입력 문서의 심볼을 덮어 쓰는 대신 새로운 출력 문서를 생성하는 실시예가 대체될 수 없는 심볼 쌍의 제1 심볼을 출력 문서로 삽입한다. 심볼 쌍의 마지막 심볼이 문서의 마지막 심볼이고 심볼 쌍이 압축 딕셔너리의 항목들 중 어느 것과도 매칭되지 않는 경우, 심볼 쌍의 두 심볼 모두 출력 문서에 삽입되어야 한다.
기재된 바와 같이, 실시예는 어떠한 추가 대체도 가능하지 않을 때까지 재귀적 패스를 수행하도록 프로그램된다. 따라서 실시예가 카탈로징 및 대체 단계를 문서(321)로 적용하여 문서(331)를 생성함으로써 제2 패스를 시작한다. 도 3의 심볼로지에서, 문서(331) 내 심볼 "R3P2"이 제2 패스의 행(3)을 지칭한다. 제2 또는 다음 패스에서 식별된 심볼 쌍이 두 개의 대체 심볼일 수 있다. 대체 심볼 R4(325 참조) 및 이에 뒤 따르는 대체 심볼 R3(문서(321) 내 제1 패스에서의 326 참조)의 시퀀스를 지칭하는 대체 심볼(335)을 참고할 수 있다. 대안으로, 나중 패스에서 식별되는 심볼 쌍이 대체 심볼과 비압축 심볼의 조합일 수 있다. 비압축 심볼 S300 및이에 뒤 따르는 대체 심볼 R3의 시퀀스를 지칭하는 대체 심볼(336)을 참고할 수 있다. 따라서 도 2의 압축 딕셔너리(200)는, 열(220)(P2)의 행(R3)에, 순차 쌍 R4 및 이에 뒤 따르는 R3을 리스팅한다. 열(210)의 검토가 R4 및 이에 뒤 따르는 R3의 시퀀스가 심볼 S1, 뒤 이어 S79, 뒤 이어 S75, 뒤 이어 S5를 나타냄을 보인다. 따라서 이 예시에서, 제2 패스(P2) 후, 실시예는 4-심볼 "구" S1-S79-S75-S5가 단일 심볼 R3P2로 대체했다.
실시예에 의한 순차 패스가 각각의 패스로부터 심볼 쌍을 저장한 추가 열(220 및 230)(도 2)을 도출한다. 실시예에서, 고유 심볼 쌍이 발견된 각각의 패스가 새로 식별된 심볼 쌍 및 이들 각자의 카운트를 저장하기 위한 압축 딕셔너리(200)에 추가되는 추가 열(열(221 및 231))을 도출한다. 도 2는 차후 패스에서 발견되는 심볼을 개별 열로 제공하여, 실시예의 재귀적 속성을 보여준다.
실시예는 해당 패스 동안 생성된 압축 딕셔너리(200)의 열 또는 섹션으로부터의 교체만을 수행한다. 실시예가 현재 패스에서 사용되지 않을 대체 심볼을 갖는 항목을 검색할 필요가 없기 때문에 패스-특정 섹션에서 대체 심볼을 저장하는 것이 룩업 시간을 감소시킨다.
대안 실시예는 상이한 패스에서 식별된 심볼 쌍을 공통 열 또는 메모리 영역에 저장한다. 이러한 실시예는 덜 복잡한 대체 심볼을 이용하기 때문에 공간 절약을 증가시킬 수 있다. 예를 들어, 압축 딕셔너리의 동일한 열에 모든 식별된 심볼 쌍을 저장하는 실시예가 행 식별자를 전체적으로 포함하는 대체 심볼을 이용할 수 있다. 일부 실시예에서, 대체 심볼을 위한 심볼의 선택에 기울이는 세심한 주의가 증가된 압축을 생성할 수 있다.
도 3에, 문서(331)에 수행된 제3 패스, 및 문서(341)에 수행된 제4 패스가 문서(351)를 생성하는 것이 도시된다. 제4 패스의 출력(문서(351))이 제3 패스의 출력(문서(341))과 동일하고, 이 것이 문서(111)와 동시에 압축되는 그 밖의 다른 모든 문서에 대해 참으로 유지된다고 가정할 때, 실시예가 각각의 문서의 마지막 출력 버전을 저장하고 압축 프로세스가 종료된다. 도 3에 제공되는 예시가 예시적 텍스트에 적용되는 프로세스의 4개의 패스만 보여준다. 그러나 임의의 개수의 패스가 수행될 수 있다. 일부 실시예에서, 패스의 개수가 고정 숫자일 수 있다. 또 다른 실시예에서, 패스의 최대 횟수가 설정될 수 있지만, 프로세스는 어떠한 추가 대체가 캡(cap) 전에 이뤄지는 경우 종료되도록 프로그램된다.
문서의 세트에 더 많은 패스가 수행됨에 따라, 식별된 심볼 쌍의 수 및 각각의 식별된 심볼 쌍의 카운트가 감소하는 경향이 있으며, 따라서 각각의 추가 패스에 의해 제공되는 증분 크기 감소가 감소된다. 그러나 각각의 추가 패스가 추가 처리 자원을 소비할 것이다. 처리 자원에 대해 크기 감소의 균형을 이루기 위해, 특정 패스로부터 도출되는 크기 감소가 특정 한계 이하인 경우(가령, 특정 패스가 퍼센트 크기 감소의 절반 미만을 생성하는 경우), 특정 실시예가 프로세스를 종료하도록 프로그램된다. 다른 실시예가 고정 된 양보다 작은 것으로 발견 된 새로운 심볼 쌍의 수 또는 특정 레벨 아래로 가장 빈번하게 발생하는 심볼 쌍의 수와 같은 다른 인자에 기초하여 프로세스를 종료한다. 또 다른 예에서, 패스에서 가장 빈번하게 발생하는 심볼 쌍의 카운트가 제1 패스에서 가장 빈번하게 발생하는 심볼의 카운트의 미리 결정된 백분율 아래로 떨어질 경우 프로세스를 종료하도록 실시예가 구성될 수 있다.
프로세스를 종료하기 위한 기준이 충족되면, 일부 실시예가 종료 조건을 트리거한 패스에서 발견된 임의의 식별된 심볼 쌍을 대체하도록 프로그램된다. 다른 실시예가 마지막 패스에서 발견된 심볼 쌍을 대체하지 않고, 종료 조건을 인식하면 즉시 프로세스를 종료한다. 또 다른 실시예가 최종 공간 절약이 지정된 양 미만일 것이라고 결정하기에 충한 텍스트를 처리한 후 불충분한 개수의 심볼 쌍이 발견되는 경우 패스 중에 종료한다. 대체되지 않은 임의의 심볼 쌍이 압축 딕셔너리에 저장되거나 대체 심볼을 할당 받을 필요가 없을 것이다.
압축 딕셔너리(200)는 복수의 문서에서 수행되는 패스의 수에 따라 임의의 개수의 열을 갖도록 커질 수 있다. 따라서 도 2는 문서(310-350)와 관련된 압축 딕셔너리(200)의 일부분만 보여준다.
실시예는 각각의 카탈로징 단계의 종료에서 정렬 및 잘라내기 동작을 수행한다. 그러나 연속 패스 동안 적용되는 임계값은 제1 패스의 임계값과 상이할 수 있다. 실시예는 추가 패스에 대한 하한 대체 임계값을 이용한다.
일부 실시예가 최상의 압축이 얻어질 때까지 상이한 패스 임계값을 갖는 일련의 시도로 문서의 서브세트를 압축함으로써 각각의 패스의 대체 임계값에 대한 이상적인 값을 결정한다.
도 4는 실시예의 동작을 보여주는 흐름도이다. 임의의 패스에 대한 카탈로징 단계(400)가 모든 고유 심볼을 식별하는 것으로 시작한다(401). 그 후, 실시예는 각각의 고유 심볼의 등장 횟수를 카운트한다(402). 그 후 실시예는 압축 딕셔너리를 고유 심볼로 채운다(403). 압축 딕셔너리를 채우는 것은 이들의 카운트를 기초로 고유 심볼 쌍을 재순서화하는 것, 임계값을 초과하지 않는 카운트를 갖는 심볼 쌍을 생략시키는 것, 및 대체 심볼을 각각의 고유 심볼 쌍과 연관시키는 것을 포함할 수 있다. 실시예는 대체 단계(450)로 이동하기 전 모든 문서에 대한 카탈로징 단계(400)를 완료한다.
대체 단계(450) 동안, 실시예는 압축 딕셔너리 내 항목과 매칭되는 심볼 쌍에 대한 입력 문서를 검색한다(451). 임의의 대체가 가능한 경우, 실시예는 심볼 쌍을 연관된 대체 심볼로 대체한다(452). 실시예는 압축 딕셔너리를 임계값을 초과하는 심볼 쌍으로만 채움으로써 (403)에서 임계값을 강제하지만, 임계값을 초과하지 않는 카운트를 갖는 심볼 쌍을 유지하는 그 밖의 다른 실시예가 단지 임계값을 초과하는 카운트를 갖는 심볼 쌍을 대체함으로써 임계값을 강제한다. 대체가 이뤄진 후(452), 실시예는 카탈로징 단계(400)로 복귀하여 이전 패스의 출력에 대해 다음 패스를 시작함으로써 재귀적으로 동작한다. 재귀 프로세스의 일부로서, 실시예는 다음 패스에 대한 셋팅에 따라 대체 임계값(도시되지 않음)을 조절한다. 패스 동안 어떠한 대체도 가능하지 않은 경우, 실시예가 압축된 출력 문서를 저장하고 종료한다(499). 필요할 때, 실시예는 각각의 패스의 대체 단계를 반전시킴으로써 압축된 문서를 복구한다.
실시예는 모든 압축된 문서를 압축해제하고, 압축 딕셔너리를 삭제하며, 복수의 문서의 일부로서 새 문서를 이용해, 비압축 문서로 프로세스(즉, 400-499)를 재-적용함으로써 새 문서를 핸들링한다. 사용자가 압축된 문서를 액세스할 때 눈에 띄는 딜레이를 경험하지 않도록 새 문서의 압축은 자원 수요가 낮은 것으로 예상되는 시간 동안 또는 오프라인 시스템에 의해 스케줄링될 수 있다.
대안 실시예가 임의의 문서의 압축해제 없이 새 문서에 카탈로징 및 대체 패스를 재귀적으로 적용함으로써 새 문서를 핸들링한다. 이러한 실시예에서, 새 문서에서 식별된 심볼 쌍이 이전에 대체 임계값을 충족하지 못했던 특정 대체 심볼의 카운트가 임계값을 초과하고 새 문서에서 사용되기 때문에 압축 딕셔너리가 잘라내 지지 않는 경우 압축이 개선된다.
그 밖의 다른 실시예가 대체 단계만 새 문서에 재귀적으로 적용한다. 이러한 실시예의 경우, 원본 문서 세트의 문서가 훈련 세트(training set)로서 역할 할 수 있다.
프로세스가 많은 양의 데이터를 가장 잘 다룬다. 압축되는 데이터가 많을수록, 긴 심볼 시퀀스가 반복될 가능성이 높을 것이다. 따라서 심볼의 수가 증가할수록 더 높은 압축 비가 얻어질 수 있다. 이러한 방식으로, 상기 실시예를 참조하여 기재된 프로세스가 "빅 데이터(big data)" 응용 분야에 적합하다. 실제로, 개시된 실시예가 부분적으로 압축 딕셔너리와 연관된 오버헤드 때문에 매우 작은 데이터 세트에 적용되는 경우 기존 기법에 비교해서 더 큰 데이터 크기를 도출할 수 있다.
마찬가지로, 복수의 문서가 특정 지식 분야로부터의 문서만 포함하는 경우, 임의의 특정 지식 분야가 분야에 특화된 텍스트에서 종종 반복되는 공통 용어 및 구를 갖기 때문에 프로세스는 개선된 압축 비를 생성할 수 있다. 다른 한편으로는, 새 지식 분야로부터의 문서가 복수의 문서에 포함될 때, 프로세스는 획득 가능한 압축 비가 감소되는 학습 곡선을 직면한다. 결국, 새 분야의 충분한 수의 문서를 처리한 후, 시스템은 상기 새 분야의 기술 용어를 "학습"할 수 있고, 압축 비가 개선된다.
도 5는 하나의 실시예의 실험 결과를 요약한다. 실험 실시예가 입력 문서 내 각각의 단어를 심볼로서 식별하도록 프로그램되었다. 실험 실시예는 입력 문서에 표준화를 적용했고, 특정 패스의 카탈로징 단계 후 상기 특정 패스와 관련된 압축 딕셔너리의 섹션을 정렬 및 잘라내기했다. 실험에서 사용된 문서는 15,000개의 랜덤하게 선택된 미국 특허의 요약서였다(백만 단어를 약간 초과). 실험 실시예가 문서에 적용되기 전에, 모든 비-문숫자 캐릭터가 제거되었고, 모든 대문자가 소문자로 변환되었다.
데이터 크기가 커질수록 압축률이 개선된다는 전제를 테스트하기 위해, 실험 실시예가 6개의 상이한 크기의 문서 그룹에 적용되었다. 표 1은 각각의 그룹의 크기 및 획득된 압축 비를 상세히 보여준다. 표 1의 데이터가 도 5에 플롯팅되어 있는데, 이때, x-축(로그 스케일)에 캐릭터의 개수가 플롯팅되고, y-축에 압축 비가 플롯팅된다. 도 5의 점선이 표 1의 데이터의 급수 회귀를 기초로 하는 추세선을 나타낸다.
표 1
입력 문서 내 캐릭터 압축 비
234 104.27%
487 96.30%
5,280 77.75%
66,864 72.89%
640,621 61.96%
6,290,146 56.09%
실험 결과에 대한 압축 비가 퍼센티지로 표현되고 압축된 데이터의 크기를 비압축 데이터의 퍼센티지로서 가리킨다. 다시 말하면, 압축 비(퍼센티지)가 압축된 캐릭터 수를 비압축 캐릭터 수로 나눈 값에 100을 곱한 값과 동일하다. 압축된 캐릭터 수는 출력 문서 내 압축된 캐릭터 수에 압축 딕셔너리 내 캐릭터의 수를 더한 값을 포함한다.
실험 실시예가 영어 텍스트에 적용될 때 기껏해야 60%인 Byte-Pair 인코딩에 의해 획득 가능한 압축 비에 비해 개선될 수 있었다. Shibata Y. et al. (2000) Speeding Up Pattern Matching by Text Compression. In: Bongiovanni G., Petreschi R., Gambosi G. (eds) Algorithms and Complexity. CIAC 2000. Lecture Notes in Computer Science, vol. 1767. Springer, Berlin, Heidelberg. 궁극적으로, 실험 실시예는 대략 백만 단어의 전체 샘플에 적용됐을 때 56.09%의 압축 비를 획득했다.
시스템 및 프로세스가 다양한 응용분야, 가령, 이메일, 뉴스, 또는 그 밖의 다른 라이브러리 아카이브 같은 아카이브의 압축에 적용될 수 있다. 프로세스는 이러한 응용 분야에 적합한데, 왜야하면 관련된 많은 심볼 수가 상당한 수의 반복되는 문자열을 생성할 가능성이 높아서, 높은 수준의 압축을 촉진시킬 수 있기 때문이다. 아카이브의 추가가 피크가 아닌 시간대 동안 발생하도록 스케줄링될 수 있고 대규모 배치(batch)로 구조화되어, 추가 문서의 압축에 의해 획득되는 공간 절약 대비 필요한 프로세싱 시간의 최상 균형을 이룰 수 있다.
도 5의 추세선은 시스템이 충분히 큰 데이터 세트에 적용된 경우, 압축 비가 계속 개선될 가능성이 높음을 암시한다. 추세선은 약 십억 개의 캐릭터에서 40% 이하를 지나가고 약 1조 개의 캐릭터에서 30% 이하를 지나간다. 위키피디아(Wikipedia)가 압축 비가 가장 효율적일 수 있는 규모를 제공할 수 있는 예시이다. 2015년에, 위키피디아의 영어 버전이 대략 230억 개의 캐릭터를 포함한다고 추산되었다. 2009년 11월(위키피디아가 모든 언어에 걸친 단어 카운트에 대한 통계를 내 놓은 마지막 달)에, 위키피디아(모든 언어)는 대략 60억 개의 단어를 가졌으며 9개월마다 10억 개의 단어의 비율로 성장하고 있었다. 단어 당 캐릭터가 6개라고 가정하면, 위키피디아(모든 언어)는 2009년 11월에 360억 개의 캐릭터를 가졌다. 이러한 성장율이 지속됐다고 가정하면, 2017년 3월에는 위키피디아(모든 언어)는 대략 16억 개의 단어 또는 1조 개의 캐릭터를 가진다고 추산된다. 따라서 위키피디아 규모의 데이터 세트를 저장하기를 원할 때 본 프로세스를 이용한 압축이 유익할 수 있다.
클라우드-기반 이메일 및 메시징 시스템과 관련된 응용분야가 또한 프로세스로부터 이점을 얻을 수 있는데, 이러한 시스템은 많은 사용자를 갖기 때문이다. 이메일의 다수가 다른 사용자로의 답장 및 다른 사용자로부터 전달된 메시지일 가능성이 높다. 이러한 메시지는 종종 원본 메시지의 전체 또는 일부를 포함하기 때문에, 프로세스가 단일 대체 심볼로 대체할 수 있는 중복된 심볼의 매우 긴 문자열을 도출한다.
많은 연속되는 패스 후 생성되는 특정 대체 심볼은 텍스트의 긴 문자열을 대체한다. 두 개의 압축된 문서가 공통으로 이러한 고차 대체 심볼을 갖는 경우, 문서들 간 관계가 추론될 수 있다. 앞서 기재된 바와 같이, 특정 분야의 작업물의 저자는 분야 및 작업 고유의 구 및 용어를 반복하는 경향이 있다. 특정 저자는 자신이 자주 언급하는 복수의 공통적인 구, 개념, 및 이야기 캐릭터를 이용할 수 있다. 이러한 상황에서, 두 작업물이 이러한 공통점을 기초로 관계 있다고 식별될 수 있다. 공통점은 문서들을 집합으로 함께 묶거나, 특정 문서를 타 문서의 파생물로 식별하거나, 특정 분야 또는 특정 저자에의 독자의 흥미를 기초로 독자에게 작업물을 제안하는 데 사용될 수 있다. 이러한 실시예는 분야에 친숙하지 않은 사용자에게 또는 실제 저자가 식별되기 어려운 상황(가령, 유령 작가 또는 표절자)에서 특히 유용하다.
프로세스는 성문화될 수 있는 임의의 데이터를 분석하는 데 사용될 수 있다. 예를 들어, 인간 얼굴의 특성이 측정치(각각의 눈의 크기, 눈과 눈 사이 거리, 눈동자 색, 눈썹 길이 등)의 세트로 성문화될 수 있다. 이들 측정치는 일관된 순서로 코드화 또는 분류되고, 포맷팅되고, 문서로 조합될 수 있다. 이러한 방식으로, 압축 프로세스가 문서의 세트에 적용될 수 있으며, 각각의 문서는 특정 개인의 안면 구조의 복수의 측정치를 포함한다. 문서가 압축된 후, 시스템은 압축된 문서 내 대체 심볼을 비교함으로써 안면 인식을 수행할 수 있다. 고차 대체 심볼이 긴 심볼 체인을 나타내기 때문에, 두 개의 문서 모두 동일한 고차 대체 심볼 중 하나 이상을 가진다는 사실이 문서 내 측정치에 의해 나타내어지는 안면이 동일한 사람의 것일 높은 가능성을 가리킨다.
두 문서 간 매칭이 임계값을 초과하는 매칭되는 고차 대체 심볼의 총 수를 기초로 결정될 수 있다. 안면 인식 시스템의 대안 실시예가 가장 가까운 매칭 및 각각의 매칭에서 신뢰도를 가리키는 값을 선택할 수 있다.
이러한 안면 인식 시스템이, 가령, 보안 위치로의 접근을 제어하기 위해 사용될 수 있다. 보안 위치는 물리적 장소(가령, 건물) 또는 디바이스(가령, 컴퓨터 시스템, 데이터베이스, 또는 이들의 보안되는 일부분)일 수 있다. 또 다른 용도가 미지의 사람의 신원을 결정하는 것일 수 있다. 또 다른 대안 용도가 특정 측정치가 인간 안면을 나타내는지 여부를 구별하기만 하는 것이다.
보안 위치로의 접근을 제어하는 경우에서, 실시예가 우선 압축 프로세스를 이용하여, 문서의 세트 - 각각의 문서가 각각이 알려진 인가된 개인들의 그룹 중 한 명씩을 나타냄 - 를 압축하고, 압축 딕셔너리를 생성할 수 있다. 차후, 보안 개체로의 접근을 요청할 때, 알려지지 않은 사람은, 자신의 얼굴의 측정치가 취해지게 하는 프로세스를 개시한다. 비-침습적 방법(가령, 하나 이상의 카메라에 의해 캡처된 이미지로부터 요구되는 값을 계산)에 의해 알려지지 않은 사람의 안면이 측정될 수 있다. 그런 다음 요구된 값이 동일한 압축 딕셔너리를 이용해 압축된 새 문서로 배열된다. 시스템은 새 문서의 압축된 버전의 대체 심볼을 이전에 압축된 문서에 담긴 건에 비교하고 결과(가령, 매칭이 존재하고 접근이 허가되어야 한다는 결과 또는 더 구체적으로는 알려지지 않은 사람의 추정 신원)를 출력한다. 일부 실시예에서, 시스템은 알려지지 않은 사람이 다른 수단에 의해, 가령, 음성 방송 또는 카드 스와이프를 통해 자신을 식별하고, 알려지지 않는 사람의 안면의 캡처된 이미지로부터 얻어진 정보를 담고 있는 문서를, 알려지지 않은 사람이 자신이라고 주장하는 사람에 대한 사전-저장된 정보를 담고 있는 문서에 대해 체크하게 할 수 있다. 또 다른 실시예에서, 시스템은 사람의 안면의 캡처된 이미지를 담고 있는 문서를 모든 인가된 사람에 대한 사전-저장된 정보를 담고 있는 모든 문서에 대해 비교할 수 있다.
안면 인식 시스템에서, 문서 내 안면 측정치의 심볼은 정확한 수치 측정치(가령, 동공간 간격 = 64.57 mm 또는 눈동자 색(RGB) = 161, 202, 241)일 수 있다. 정확한 측정치의 사용이 높은 확실성을 생성할 수 있다. 정확한 측정을 사용하면 발견된 모든 일치 항목에서 높은 확실성을 얻을 수 있지만 부정 오류를 초래할 수도 있다. 시간이 지남에 따라 측정 조건 또는 장비 교정에 약간의 변동이 잘못된 식별을 초래할 수 있다. 따라서 심볼은 대략적인 측정 또는 측정이 속하는 범위를 나타내는 값을 사용하는 것이 바람직하다. 범위의 심볼은 범위의 수치 값, 상기 범위의 평균 값, 또는 범위를 나타내는 임의의 심볼을 포함할 수 있다.
각각의 안면 인식 문서는 잘못된 식별을 피하기 위해 충분한 개수의 측정치를 가질 필요가 있다. 너무 적은 측정치는 매칭을 잘못 식별할 위험을 초래한다. 알려진 안면을 나타내는 문서의 충분히 큰 세트를 분석함으로써, 시스템은 필요한 측정치의 수 및 충분한 비교점을 생성하기 위해 필요한 측정치의 최적 순서 또는 그룹화 방식을 결정하는 데 사용될 수 있기 때문에, 안면 인식 프로세스의 또 다른 용도가 본 명세서에 언급된 프로세스를 기초로 안면 인식 시스템을 조사 및 개선하는 것이다.
프로세스의 또 다른 실제 응용은 문서의 내용을 분석하기 위해 압축된 문서에서 인식된 공통성을 사용한다. 카운트되고 대체 심볼과 연관된 심볼 쌍이 기본 의미를 가진다. 따라서 문서의 저자 또는 주제에 관한 생각, 선호 또는 그 밖의 다른 정보가 심볼 쌍으로부터 추론될 수있다. 카탈로징 단계 동안 수집된 데이터는 이러한 정보에 대한 풍부한 정보를 제공할 수 있다.
확장된 기능을 갖는 실시예가 특정 명사 또는 동사와 연관된 특정 대체 심볼을 알림으로써 프로세스를 이용해 텍스트의 콘텐츠에 대해 더 많이 학습할 수 있다. 예를 들어, 이러한 시스템은 심볼 쌍에 특정 대체 심볼을 태그 또는 기억할 수 있다.
예를 들어, 이러한 시스템은 대체 기호로 표시되는 기호 쌍에서 관심있는 단어를 포함하는 특정 대체 기호에 태그를 지정하거나 기억할 수 있습니다. 예를 들어, "사랑" 또는 "호감"와 같은 단어를 포함하는 심볼 쌍은 심볼 쌍이 긍정적인 감정을 나타내는 방식으로 연관된 대체 심볼이 태그될 수 있다. 반대로, "증오" 또는 "혐오"와 같은 단어를 포함하는 심볼 쌍은 심볼 쌍이 부정적인 감정을 나타냄을 가리키는 방식으로 연관된 대체 기호가 태그될 수 있다. 또 다른 예를 들면, 명사를 포함하는 심볼 쌍은 관심 영역, 예를 들어, 애완 동물, 가족 또는 제품에 따라 분류될 수 있다.
이러한 태깅을 사용하여, 태깅된 대체 심볼의 쌍 또는 세트가 압축된 텍스트에서 발생하는 근접성 또는 시퀀스에 기초하여, 프로세스는 특정 개체 또는 개념에 대해 저자에 의해 표현된 느낌을 추론할 수 있다. 예를 들어, 긍정적인 감정을 나타내는 태그가 부착된 대체 심볼이 애완 동물을 나타내는 태그가 부착된 대체 시스템에 가깝거나 "개"와 같은 특정 단어에 근접한 경우 시스템은 저자가 애완 동물을 좋아하거나 개를 좋아한다고 추론할 수 있다. 구체적인 설명적 단어를 추적하면 특정 저자가 표현한 개념을 보다 세밀하게 이해할 수 있다(가령, 크기와 무관하게 일반적으로 개를 사랑하는 것에 반해 작은 개를 사랑함). 이러한 실시예에서, 이후의 패스 동안 할당된 대체 심볼은 나중에 할당된 대체 심볼과 연관된 심볼 쌍을 구성하는 이전에 할당된 대체 심볼에 할당된 속성을 상속할 수 있다. 예를 들어, P2 교체 심볼이 "긍정적 감정" 지시자인 것으로 태그되고 상이한 P2 대체 심볼이 "애완 동물" 지시자로 태그되는 경우, 패스 3에서 P2 대체 심볼을 모두 포함하는 P3 대체 심볼이 "애완동물을 사랑함"을 가리키는 것으로 태그될 수 있다. 이러한 방식으로, 상이한 저자들 간 고차 대체 심볼의 반복되는 등장이 공통 관심을 가리킬 수 있다. 두 명의 상이한 저자의 작업이 동일한 P3 대체 심볼을 포함하는 경우, 이들은 공통적인 애완동물 사랑을 공유할 수 있다.
하나의 실시예의 구현예가 이메일 아카이브와 관련하여 사용된다. 특정 저자 또는 작업 그룹에 의해 작성된 이메일의 분석이 저자 또는 그룹의 선호, 가령, 저자가 좋아하는 제품, 식당, 도시 등을 식별하는 데 사용된다. 긍정적인 감정을 표현하는 단어와 특정 유형의 동물을 참조하는 단어를 빈번하게 조합하는 저자가 이러한 동물을 소유할 가능성으로 식별될 수 있다. 그런 다음 실시예가 이러한 분석으로부터 결정된 연관관계를 사용자에게 제품의 추천 또는 광고를 하기 위한 시스템으로 제공한다.
개시된 실시예 및 방법의 균등예가 본 발명의 범위 내에 있다. 개시된 실시예 및 방법, 및 이의 균등예가 본 발명의 범위 내에서 수정될 수 있다.
지금까지의 상세한 설명에서, 본 발명을 단순화하기 위한 목적으로 여러 실시예에서 다양한 특징이 함께 그룹지어질 수 있다. 이 개시 방법은 임의의 청구되는 실시예가 대응하는 청구항에서 명시적으로 언급되는 것보다 더 많은 특징을 필요로 하는 것으로 해석되지 않을 것이다. 오히려, 첨부된 청구항이 반영하듯이, 본 발명의 주제 사항은 단일 개시된 실시예의 모든 특징보다 적게 필요로 할 수 있다. 따라서, 이하의 청구항은 상세한 설명 내에 포함되며, 이때, 각각의 청구항은 개별적으로 개시된 실시예로서 나타난다. 용어 "실시예"의 사용이 다른 실시예와 관련하여 개시된 특징의 어떠한 배제도 의미하지 않는다. 오히려, 하나의 실시예 또는 실시예 그룹으로부터의 특징이 그 밖의 다른 임의의 실시예 또는 실시예 그룹의 특징과 결합될 수 있다. 따라서 본 발명은 하나 이상의 개시되거나 청구된 특징의 임의의 적합한 세트(즉, 양립불가도 아니고 상호 배타적이지도 않은 특징들의 세트), 가령, 어느 특정 실시예에서도 조합으로 명시적으로 개시되지 않을 수 있는 특징들의 조합을 갖는 임의의 실시예를 묵시적으로 개시하는 것으로도 해석되어야 한다. 이하의 청구항의 범위는 본 명세서에 개시된 주제 사항 전체를 반드시 포함할 필요는 없다.
본 개시 및 첨부된 청구 범위의 목적을 위해, 접속사 "또는"은 포괄적으로 해석되어야한다(가령, "개 또는 고양이"는 "개, 또는 고양이, 또는 둘 다"로 해석 될 수 있다); 개, 고양이 또는 쥐"는 다음과 같은 경우를 제외하고 "개, 또는 고양이, 또는 쥐, 또는 임의의 둘, 또는 셋 모두)로 해석될 것이다: (i) 가령, "둘 중 하나" "~ 중 단 하나", 또는 유사한 언어의 사용에 의해 달리 명시적으로 언급되지 않는 한; 또는 (ii) 나열된 대안 중 둘 이상이 특정 맥락에서 상호 배타적인 경우,이 경우 "또는"은 비 상호 배타적 대안을 포함하는 조합만을 포함할 것이다. 본 개시 내용 및 첨부된 청구 범위의 목적 상, "포함하는(comprising)", "포함하는(including)", "갖는(having)" 및 이들의 변형은, 나타날 때마다, 구 "적어도"가 각각의 사례 후에 추가되는 것처럼 동일한 의미를 갖고, 개방형 용어로 해석되어야 한다.
첨부된 청구 범위에서, 35 USC §112 ¶ 6의 규정이 장치 청구항에서 적용되기를 원한다면, "수단"이라는 단어가 그 장치 청구항에 나타날 것이다. 이러한 조항이 방법 청구항에 적용되기를 원하는 경우 "단계"라는 단어가 해당 방법 청구항에서 나타난다. 반대로, "수단" 또는 "단계"라는 단어가 청구항에 나타나지 않으면 35 USC §112 ¶ 6의 조항은 해당 청구항에 대해 적용되지 않는다.
임의의 하나 이상의 개시가 참조에 의해 본 명세서에 포함되고 그러한 포함 된 개시가 본 개시와 일부 또는 전체적으로 상충되거나 범위가 상이할 경우, 그 상충의 범위, 더 넓은 개시 또는보다 넓은 정의의 범위까지 용어, 본 발명은 제어한다. 그러한 통합 된 공개가 부분적으로 또는 전체적으로 서로 충돌하는 경우, 충돌의 정도까지 최신 공개가 제어된다.
특허 문헌 내 특정 주제를 검색하는 것을 보조하기 위한 수단으로서 요약서가 제공된다. 그러나 요약서는 본 명세서에서 언급되는 임의의 요소, 특징, 또는 한계가 임의의 특정 청구항에 의해 포함되어야 함을 의미하지는 않는다.
이 문단은 압축 프로세스의 하나의 구현예에 대한 컴퓨터 코드(Microsoft Excel 2016에서 Microsoft Visual Basic for Applications 7.1)를 포함하며, 여기서 다뤄지는 심볼은 단어이다:
Sub f_clean_up_Final_Memory_text_independent_data()
'Final Memory (text, independent) 클린 업을 위한 모듈
'소문자 변환을 위한 제1 수식을 생성
Range("B4") = "=LOWER(RC[-1])"
'하향으로 열 A에서 데이터 세트의 끝을 검출
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, 1))
a = a + 1
Loop
a = a - 1
'제1 수식을 다음 행으로 복사
Range("B4").Copy
Range(Cells(5, 2), Cells(a, 2)).Select
ActiveSheet.Paste
'열 B의 전체 수식 세트를 열 A로 복사
Range(Cells(4, 2), Cells(a, 2)).Copy
Range("A4").PasteSpecial Paste:=xlPasteValues
'열 B의 내용 삭제
Range(Cells(4, 2), Cells(a, 2)).ClearContents
'일부 심볼을 "(nothing)" 또는 "(space)"로 대체
Range(Cells(4, 1), Cells(a, 1)).Replace What:=";", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=":", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=",", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=".", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="~?", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="!", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="+", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="-", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="―", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="-", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="/", Replacement:=" / ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'s", Replacement:=" 's", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'s", Replacement:=" 's", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="""", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=""", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=""", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="''", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="''", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="`", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="[", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="]", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="{", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="}", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="(", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=")", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=">>", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="<<", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=">", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="<", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="@", Replacement:="@ ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="%", Replacement:=" percent", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="$", Replacement:="$ ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="£", Replacement:="£", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="#", Replacement:="# ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="~*", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="~* ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="~*", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="=", Replacement:="= ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="·", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="·", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=" ", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
End Sub
Sub a_for_mem01()
' a_for_mem01
'lmem 시트에서 이전 항목 삭제
Range("C4:BYB1048576").ClearContents
'pro01 시트에서 이전 항목 삭제
Sheets("pro01").Select
Cells.Delete
'pro02 시트에서 이전 항목 삭제
Sheets("pro02").Select
Cells.Delete
'pro03 시트에서 이전 항목 삭제
Sheets("pro03").Select
Cells.Delete
'lmem 시트로 되돌아 가기
Sheets("lmem").Select
'하향으로 Final Memory (text, independent) 길이 결정
a = 3
Do Until IsEmpty(Cells(a, 1))
a = a + 1
Loop
a = a - 1
'pro01 시트로 Final Memory를 복사
Range("A3:A" & a & "").Copy
Sheets("pro01").Select
Range("A1").Select
ActiveSheet.Paste
'단어 분할
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Semicolon:=True, Comma:=True, Tab:=True, Space:=True, Other:=True, OtherChar:= _
"-", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)), TrailingMinusNumbers:=True
'가장 긴 행 찾기
e = 1
d = 2
Do Until IsEmpty(Cells(d, 1))
c = 1
Do Until IsEmpty(Cells(d, c))
c = c + 1
Loop
c = c - 1
If c > e Then
e = c
End If
d = d + 1
Loop
e = e '가장 긴 열의 최종 숫자 찾기
'헤더 넣기
f = 1
Do Until f = e + 1
Cells(1, f) = "" & f & ""
f = f + 1
Loop
'가장 왼쪽에서 열을 삽입
Columns("A:A").Insert Shift:=xlToRight
'하향으로 데이터 세트의 끝 결정
a = 1
Do Until IsEmpty(Cells(a, 2))
a = a + 1
Loop
a = a - 1
'피봇 테이블(정산 방식)
ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
Array("pro01!R1C1:R" & a & "C" & e + 1 & "", "Item1"), Version:=xlPivotTableVersion14). _
CreatePivotTable TableDestination:="'pro01'!R1C" & e + 4 & "", _
TableName:="PivotTable1", DefaultVersion:=xlPivotTableVersion14
ActiveSheet.PivotTables("PivotTable1").DataPivotField.PivotItems("Count of Value").Position = 1
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Value")
.Orientation = xlRowField
.Position = 2
End With
ActiveSheet.PivotTables("PivotTable1").PivotFields("Page1").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Column").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Row").Orientation = xlHidden
'하향으로 피봇 테이블의 끝 검출
i = 3
Do Until IsEmpty(Cells(i, e + 4))
i = i + 1
Loop
i = i - 1
'피봇 테이블 내용을 다음 오른쪽으로 복사
Range(Cells(3, e + 4), Cells(i - 1, e + 5)).Copy
Cells(3, e + 6).Select
ActiveSheet.Paste
'복사된 테이블을 카운트가 큰 순에서 작은 순으로 정렬
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(4, e + 7), Cells(i - 1, e + 7)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01").Sort
.SetRange Range(Cells(3, e + 6), Cells(i - 1, e + 7))
.Header = xlYes
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'있다면 (blank) 삭제
If Cells(i - 1, e + 6) = "(blank)" Then
j = i - 2
Else: j = i - 1
End If
'정렬된 테이블을 lmem 시트로 복사
Range(Cells(4, e + 6), Cells(j, e + 7)).Copy
Sheets("lmem").Select
Range("E4").PasteSpecial Paste:=xlPasteValues
End Sub
Sub b_replace_word_to_address()
'단어를 주소로 대체하기 위한 모듈
'pro01 시트에서 이전 항목을 삭제
Sheets("pro01").Select
Cells.Delete
'pro02 시트에서 이전 항목을 삭제
Sheets("pro02").Select
Cells.Delete
'pro03 시트에서 이전 항목 삭제
Sheets("pro03").Select
Cells.Delete
'lmem 시트로 돌아가기
Sheets("lmem").Select
'하향으로 Final Memory (text, independent) 길이 결정
a = 3
Do Until IsEmpty(Cells(a, 1))
a = a + 1
Loop
a = a - 1
'lmem 시트로 Final Memory 복사
Range("A3:A" & a & "").Copy
Sheets("pro01").Select
Range("A1").Select
ActiveSheet.Paste
'단어 분할
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Semicolon:=True, Comma:=True, Tab:=True, Space:=True, Other:=True, OtherChar:= _
"-", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)), TrailingMinusNumbers:=True
'lmem 시트로 돌아가기
Sheets("lmem").Select
'하향으로 Memory01 데이터의 끝 결정
b = 3
Do Until IsEmpty(Cells(b, 5))
b = b + 1
Loop
b = b - 1
'Memory01 데이터를 pro02로 복사
Range(Cells(2, 5), Cells(b, 6)).Copy
Sheets("pro02").Select
Cells(2, 1).PasteSpecial Paste:=xlPasteValues
'주소 열 생성
c = 4
Do Until IsEmpty(Cells(c, 1))
Cells(c, 3) = ("R" & c & "C5")
c = c + 1
Loop
'pro01 시트로 돌아가기
Sheets("pro01").Select
'하향으로 데이터 세트의 끝 결정
d = 1
Do Until IsEmpty(Cells(d, 1))
d = d + 1
Loop
d = d - 1
'초기 길이 숫자 생성
Sheets("pro03").Cells(1, 1) = 1
g = Sheets("pro03").Cells(1, 1)
'시트 pro01로 가기
Sheets("pro01").Select
'오른쪽으로 데이터 세트의 최대 길이를 결정
e = 2
Do Until IsEmpty(Sheets("pro01").Cells(e, 1))
f = 1
Do Until IsEmpty(Sheets("pro01").Cells(e, f))
f = f + 1
Loop
f = f - 1
If f >= g Then
Sheets("pro03").Cells(1, 1) = f
g = Sheets("pro03").Cells(1, 1)
End If
e = e + 1
Loop
h = g '오른쪽으로 최대 길이 값
'단어를 주소 숫자로 대체
k = 4
Do Until IsEmpty(Sheets("pro02").Cells(k, 1))
'주소 명칭 정의
i = Sheets("pro02").Cells(k, 3)
'단어 명칭 정의
j = Sheets("pro02").Cells(k, 1)
'단어에서 주소로 실제 대체
Range(Cells(2, 1), Cells(d, h)).Replace What:="" & j & "", Replacement:="" & i & "", LookAt:=xlWhole, SearchOrder:=xlByRows
k = k + 1
Loop
'결합된 주소 만들기
p = 2
Do Until IsEmpty(Sheets("pro01").Cells(p, 1))
'pro03 시트에서 이전 항목 삭제
Sheets("pro03").Cells.Delete
'모든 결합된 주소 시퀀스를 만들기
Sheets("pro03").Cells(1, 1) = Sheets("pro01").Cells(p, 1)
m = 2
Do Until IsEmpty(Sheets("pro01").Cells(p, m))
Sheets("pro03").Cells(m, 1).FormulaR1C1 = "='pro03'!R" & m - 1 & "C1&"" ""&'pro01'!R" & p & "C" & m & ""
m = m + 1
Loop
'데이터 세트의 끝 검출
n = 1
Do Until IsEmpty(Sheets("pro03").Cells(n, 1))
n = n + 1
Loop
n = n - 1
'시퀀스를 수식에서 값으로 변환하고 pro01로 붙여넣기
Sheets("pro03").Cells(n, 1).Copy
Sheets("pro01").Cells(p, h + 2).PasteSpecial Paste:=xlPasteValues
p = p + 1
Loop
'결합된 주소 데이터 세트의 끝 검출
q = 2
Do Until IsEmpty(Sheets("pro01").Cells(q, h + 2))
q = q + 1
Loop
q = q - 1
'결합된 주소 세트를 lmem 시트로 복사
Range(Cells(2, h + 2), Cells(q, h + 2)).Copy
Sheets("lmem").Select
Range("C4").Select
ActiveSheet.Paste
End Sub
Sub c_find_2_same_sequence()
'이 프로그램 세트의 핵심!!!
For x = 2 To 1000
y = 2 * x + 3
'pro01 시트에서 이전 항목 삭제
Sheets("pro01").Select
Cells.Delete
'pro03 시트에서 이전 항목 삭제
Sheets("pro03").Select
Cells.Delete
'타일 "combined" 넣기
Cells(1, 1) = "combined"
'lmem 시트로 돌아가기
Sheets("lmem").Select
'하향에서 열 C의 끝 검출
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, 3))
a = a + 1
Loop
a = a - 1
'이를 pro01 시트로 복사
Range(Cells(3, 3), Cells(a, 3)).Copy
Sheets("pro01").Select
Range("A1").PasteSpecial Paste:=xlPasteValues
'데이터 세트 분할
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=True, Comma:=True, Space:=True, Other:=True, OtherChar:= _
"-", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), _
TrailingMinusNumbers:=True
'초기 g 값 넣기
Sheets("pro03").Cells(1, 1) = 1
g = Sheets("pro03").Cells(1, 1)
'오른쪽으로 데이터 세트의 최대 길이 결정
e = 2
Do Until IsEmpty(Sheets("pro01").Cells(e, 1))
f = 1
Do Until IsEmpty(Sheets("pro01").Cells(e, f))
f = f + 1
Loop
f = f - 1
If f >= g Then
Sheets("pro03").Cells(1, 1) = f
g = Sheets("pro03").Cells(1, 1)
End If
e = e + 1
Loop
'페어링된 주소 배치
i = 2
Do Until IsEmpty(Sheets("pro01").Cells(i, 1))
t = 1
Do Until IsEmpty(Sheets("pro01").Cells(i, t))
t = t + 1
Loop
t = t - 1
If t > 1 Then
h = 2
Do Until IsEmpty(Sheets("pro01").Cells(i, h))
Cells(i, (g + 2) + (h - 2)) = "=R" & i & "C" & h - 1 & "&"" ""&R" & i & "C" & h & ""
h = h + 1
Loop
Else: Cells(i, g + 2) = "zzz"
End If
i = i + 1
Loop
'헤더 넣기
f = 1
Do Until f = g
Cells(1, g + 1 + f) = "" & f & ""
f = f + 1
Loop
'하향으로 데이터 세트의 끝 검출
j = 1
Do Until IsEmpty(Cells(j, g + 2))
j = j + 1
Loop
j = j - 1
'정산 방식으로 피봇 테이블링
ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
Array("pro01!R1C" & g + 1 & ":R" & j & "C" & g + 1 + g - 1 & "", "Item1"), Version:=6). _
CreatePivotTable TableDestination:="'pro01'!R1C" & g + 1 + g - 1 + 2 & "", TableName:= _
"PivotTable1", DefaultVersion:=6
ActiveSheet.PivotTables("PivotTable1").DataPivotField.PivotItems("Count of Value").Position = 1
ActiveSheet.PivotTables("PivotTable1").PivotFields("Page1").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Column").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Row").Orientation = xlHidden
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Value")
.Orientation = xlRowField
.Position = 1
End With
'2개의 빈 행 삭제
Range(Cells(1, 2 * g + 2), Cells(2, 2 * g + 3)).Delete Shift:=xlUp
'피봇 테이블의 끝 검출
p = 1
Do Until IsEmpty(Sheets("pro01").Cells(p, 2 * g + 3))
p = p + 1
Loop
p = p - 1
If Cells(p, 2 * g + 2) = "Grand Total" Then
p = p - 1
End If
'오른쪽에서 피봇 테이블 복사
If Cells(p, 2 * g + 2) = "zzz" Then
Range(Cells(1, 2 * g + 2), Cells(p - 1, 2 * g + 3)).Copy
Else: Range(Cells(1, 2 * g + 2), Cells(p, 2 * g + 3)).Copy
End If
Cells(1, 2 * g + 5).Select
ActiveSheet.Paste
Selection.Columns.AutoFit
'내림차순으로 정렬
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(2, 2 * g + 6), Cells(p, 2 * g + 6)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("pro01").Sort
.SetRange Range(Cells(1, 2 * g + 5), Cells(p, 2 * g + 6))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'명칭 변경
q = 2 * g + 5
'하향으로 데이터 세트의 끝 검출
aa = 1
Do Until IsEmpty(Cells(aa, q + 1))
aa = aa + 1
Loop
aa = aa - 1
'빈도 한계 숫자 정의
w = Sheets("para").Cells(x + 4, 2)
'빈도 X 셀 미만의 시작 찾기
If aa = 2 Then
If w >= 2 Then
If Cells(aa, q + 1) <= w - 1 Then
r = 2
Else: r = 3
End If
Else: r = 3
End If
End If
If aa > 2 Then
If w >= 2 Then
For bb = 1 To aa
If Cells(bb, q + 1) <= w - 1 Then
cc = bb
bb = aa
Else: cc = aa + 1
End If
Next bb
r = cc
Else: r = aa + 1
End If
End If
'If x = 2 Then
'종료
'End If
If r > 2 Then
'빈도 X 셀의 끝 찾기
s = r
Do Until IsEmpty(Cells(s, q + 1))
s = s + 1
Loop
s = s - 1
'불필요한 빈도 삭제
If w >= 2 Then
Range(Cells(r, q), Cells(s + 500, q + 1)).Delete Shift:=xlUp '<--- 500은 여분의 버퍼
End If
'레이어 ID 찾기 테이블을 위한 헤더 넣기
Cells(1, q + 3) = "1st C Position"
Cells(1, q + 4) = "Space Position"
Cells(1, q + 5) = "2nd C Position"
Cells(1, q + 6) = "End Position"
Cells(1, q + 7) = "1st layer#"
Cells(1, q + 8) = "2nd Layer#"
'첫번째 행의 수식 입력
Cells(2, q + 3) = "=Find(""C"", rc[-3], 1)"
Cells(2, q + 4) = "=find("" "",rc[-4],1)"
Cells(2, q + 5) = "=find(""C"",rc[-5],rc[-1])"
Cells(2, q + 6) = "=len(rc[-6])"
Cells(2, q + 7) = "=mid(rc[-7],rc[-4]+1,rc[-3]-(rc[-4]+1))"
Cells(2, q + 8) = "=mid(rc[-8],rc[-3]+1,rc[-2]-rc[-3])"
'데이터 세트의 끝 검출
t = 1
Do Until IsEmpty(Sheets("pro01").Cells(t, q))
t = t + 1
Loop
t = t - 1
'첫 번째 행을 다른 행에 복사
If t > 2 Then
Range(Cells(2, q + 3), Cells(2, q + 8)).Copy
Range(Cells(3, q + 3), Cells(t, q + 3)).PasteSpecial Paste:=xlAll
End If
'수식으로부터의 레이어 숫자를 텍스트로 변환
Range(Cells(1, q + 7), Cells(t, q + 8)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
'레이어 숫자를 텍스트에서 값으로 변환
Range(Cells(1, q + 7), Cells(t, q + 7)).Select
Selection.TextToColumns Destination:=Cells(1, q + 7), DataType:=xlFixedWidth, _
OtherChar:="-", FieldInfo:=Array(0, 1), TrailingMinusNumbers:=True
Range(Cells(1, q + 8), Cells(t, q + 8)).Select
Selection.TextToColumns Destination:=Cells(1, q + 8), DataType:=xlFixedWidth, _
OtherChar:="-", FieldInfo:=Array(0, 1), TrailingMinusNumbers:=True
'데이터 세트를 제1 레이어 #으로 정렬하고 그 후 제2 레이어 #로 정렬
If x > 2 Then
Range(Cells(1, q), Cells(t, q + 8)).Select
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(2, q + 7), Cells(t, q + 7)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(2, q + 8), Cells(t, q + 8)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01").Sort
.SetRange Range(Cells(1, q), Cells(t, q + 8))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'데이터 세트의 끝 검출
aa = 1
Do Until IsEmpty(Cells(aa, q + 7))
aa = aa + 1
Loop
aa = aa - 1
'제1 레이어#에서 더 작은 레이어 숫자의 끝 검출
For gg = 2 To aa
If Cells(gg, q + 7) = 2 * x + 1 Then
dd = gg
gg = aa
End If
Next gg
If dd = Empty Then
dd = 3000000000000#
End If
'제2 레이어#에서 더 작은 레이어 숫자의 끝 검출
For hh = 2 To aa
If Cells(hh, q + 8) = 2 * x + 1 Then
ee = hh
hh = aa
End If
Next hh
If ee = Empty Then
ee = 3000000000000#
End If
'dd와 ee 중 더 작은 것 찾기
If dd >= ee Then
cc = ee
Else: cc = dd
End If
'이전 레이어 행만 삭제
If cc > 2 Then
Range(Cells(2, q), Cells(cc - 1, q + 8)).Delete
End If
'데이터 세트의 끝 검출
t = 1
Do Until IsEmpty(Sheets("pro01").Cells(t, q))
t = t + 1
Loop
t = t - 1
'데이터 세트가 빈 경우, t 값을 조이고 이 프로그램을 강제 종료함
If t = 1 Then
t = 0
End If
'데이터 세트를 페어링의 카운트(쌍의 빈도)로 정렬
Range(Cells(1, q), Cells(t, q + 8)).Select
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(2, q + 1), Cells(t, q + 1)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01").Sort
.SetRange Range(Cells(1, q), Cells(t, q + 8))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
'데이터 세트의 끝을 검출
t = 1
Do Until IsEmpty(Sheets("pro01").Cells(t, q))
t = t + 1
Loop
t = t - 1
'정렬된 테이블을 lmem 시트로 복사
Range(Cells(2, q), Cells(t, q + 1)).Copy
Sheets("lmem").Select
Cells(4, y).Select '<-------------여기!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ActiveSheet.Paste
'---------------2개의 단어 셀을 하나로 대체하기 위한 모듈---------------------
'pro01 시트에서 이전 항목 삭제
Sheets("pro01").Select
Cells.Delete
'lmem 시트로 돌아가기
Sheets("lmem").Select
'Final Memory (associated) 열에서 데이터 세트의 끝 결정
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, 3))
a = a + 1
Loop
a = a - 1
'Final Memory (associated)를 pro01 시트로 복사
Range(Cells(3, 3), Cells(a, 3)).Copy
Sheets("pro01").Cells(1, 1).PasteSpecial Paste:=xlPasteValues
'pro01 시트로 가기
Sheets("pro01").Select
'열 A의 열 폭을 조절
Columns("A:A").ColumnWidth = 240
'lmem 시트로 돌아가기
Sheets("lmem").Select
'MemoryXX에서 데이터 세트의 끝 결정
b = 3
Do Until IsEmpty(Sheets("lmem").Cells(b, y)) '<-----------9는 변수여야 한다
b = b + 1
Loop
b = b - 1
'MemoryXX를 pro01 시트로 복사
Range(Cells(3, y), Cells(b, y + 1)).Copy '<------------9 및 10은 변수여야 한다
Sheets("pro01").Cells(1, 3).PasteSpecial Paste:=xlPasteValues
'pro01 시트로 가기
Sheets("pro01").Select
'열 A의 열 폭을 조절
Columns("C:D").Columns.AutoFit
'타일 넣기
Cells(1, 5) = "MemoryXX address"
'하향으로 MemoryXX의 끝 검출
c = 1
Do Until IsEmpty(Sheets("pro01").Cells(c, 3))
c = c + 1
Loop
c = c - 1
'MemoryXX 주소 넣기
d = 2
Do Until IsEmpty(Sheets("pro01").Cells(d, 3))
Cells(d, 5) = "R" & d + 2 & "C" & y & "" '<----------------9는 변수여야 한다
d = d + 1
Loop
'열 A에서 데이터 세트의 끝 검출
e = 1
Do Until IsEmpty(Sheets("pro01").Cells(e, 1))
e = e + 1
Loop
e = e - 1
'홈 위치로 가기
Range("A1").Select
'2개의 단어를 하나로 대체
f = 2
Do Until IsEmpty(Sheets("pro01").Cells(f, 5))
g = Sheets("pro01").Cells(f, 3)
h = Sheets("pro01").Cells(f, 5)
Range("A2:A" & e & "").Replace What:="" & g & "", Replacement:="" & h & "", LookAt:=xlPart, SearchOrder:=xlByRows
f = f + 1
Loop
'열 A에서 데이터 세트의 끝 검출
i = 1
Do Until IsEmpty(Sheets("pro01").Cells(i, 1))
i = i + 1
Loop
i = i - 1
'열 A를 lmem 시트로 복사
Range(Cells(1, 1), Cells(i, 1)).Copy
Sheets("lmem").Select
Range("C3").PasteSpecial Paste:=xlPasteValues
Else: x = 1000
End If
Next x
'lmeme 시트로 가기
Sheets("lmem").Select
Range("A1").Select
End Sub
Sub d_text_to_formula()
' formulatext Macro
For c = 1 To 1000
'case separation Final memory cooking and Mem02< cooking
If c = 1 Then
d = 3
Else: d = 2 * c + 3
End If
'데이터 세트의 끝 검출
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, d))
a = a + 1
Loop
a = a - 1
'공백을 &" "&로 대체
Range(Cells(4, d), Cells(a, d)).Replace What:=" ", Replacement:="&"" ""&", LookAt:=xlPart, SearchOrder:=xlByRows
'pro01 시트에서 이전 항목 삭제
Sheets("pro01").Select
Cells.Delete
'lmem 데이터를 pro01 시트로 복사
Sheets("lmem").Select
Range(Cells(3, d), Cells(a, d)).Copy
Sheets("pro01").Select
Range("A1").Select
ActiveSheet.Paste
'열 폭 조절
Selection.Columns.AutoFit
'타일을 열 B로 넣기
Range("B1") = "with ="
'하향으로 데이터 세트의 끝 검출
b = 1
Do Until IsEmpty(Sheets("pro01").Cells(b, 1))
b = b + 1
Loop
b = b - 1
If Not b = 1 Then
'제1 수식 넣기
Range("B2").FormulaR1C1 = "=""=""&RC[-1]"
Range("B2").Copy
Range(Cells(2, 2), Cells(b, 2)).Select
ActiveSheet.Paste
'전체 열 B 선택
Columns("B:B").Select
'수식을 값으로 변환
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
'텍스트를 갱신된 수식으로 변환
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlFixedWidth, _
OtherChar:="-", FieldInfo:=Array(0, 1), TrailingMinusNumbers:=True
'갱신된 수식을 lmem 시트로 복사
Range(Cells(2, 2), Cells(b, 2)).Copy
Sheets("lmem").Select
Cells(4, d).Select
ActiveSheet.Paste
Else: c = 1000
End If
Next c
'lmem 시트로 돌아가기
Sheets("lmem").Select
Range("A1").Select
End Sub
Sub e_formula_to_text()
'수식을 텍스트로 변환하여 주소가 보여지게 하는 모듈
For b = 1 To 1000
If b = 1 Then
c = 3
Else: c = 2 * b + 3
End If
'하향으로 데이터 세트의 끝 검출
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, c))
a = a + 1
Loop
a = a - 1
If Not a = 3 Then
'목표 데이터 세트 선택
Range(Cells(4, c), Cells(a, c)).Select
'셀 내용 디스플레이를 결과에서 수식으로 변경
ActiveWindow.DisplayFormulas = True
'"="를 "(nothing)"로 대체
Selection.Replace What:="=", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
'&" "&를 "(space)"로 대체
Selection.Replace What:="&"" ""&", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
'셀 내용을 다시 수식에서 결과로 변경
ActiveWindow.DisplayFormulas = False
Else: b = 1000
End If
Next b
'lmem 시트로 돌아가기
Sheets("lmem").Select
Range("A1").Select
End Sub
이 문단은 압축 프로세스의 하나의 구현예에 대한 컴퓨터 코드(Microsoft Excel 2016에서 Microsoft Visual Basic for Applications 7.1)를 포함하며, 여기서 다뤄지는 심볼은 문숫자 캐릭터이다:
Sub f_clean_up_Final_Memory_text_independent_data()
'Final Memory (text, independent)를 클린 업하기 위한 모듈
'소문자 변환을 위한 제1 수식 생성
Range("B4") = "=LOWER(RC[-1])"
'하향에서 열 A에서 데이터 세트의 끝 검출
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, 1))
a = a + 1
Loop
a = a - 1
'제1 수식을 다음 행에 복사
Range("B4").Copy
Range(Cells(5, 2), Cells(a, 2)).Select
ActiveSheet.Paste
'열 B의 전체 수식을 열 A에 복사
Range(Cells(4, 2), Cells(a, 2)).Copy
Range("A4").PasteSpecial Paste:=xlPasteValues
'열 B의 내용 삭제
Range(Cells(4, 2), Cells(a, 2)).ClearContents
'일부 심볼을 "(nothing)" 또는 "(space)"로 대체
Range(Cells(4, 1), Cells(a, 1)).Replace What:=";", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=":", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=",", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=".", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="~?", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="!", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="+", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="-", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="―", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="-", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="/", Replacement:=" / ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'s", Replacement:=" 's", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'s", Replacement:=" 's", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="""", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=""", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=""", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="''", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="''", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="`", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="[", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="]", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="{", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="}", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="(", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=")", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=">>", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="<<", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=">", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="<", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="@", Replacement:="@ ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="%", Replacement:=" percent", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="$", Replacement:="$ ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="£", Replacement:="£", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="#", Replacement:="# ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="~*", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="~* ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="=", Replacement:="= ", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="?quot;, Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:="·", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
Range(Cells(4, 1), Cells(a, 1)).Replace What:=" ", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
End Sub
Sub a_for_mem01()
' a_for_mem01
'lmem 시트에서 이전 항목 삭제
Range("C4:BYB1048576").ClearContents
'pro01 시트에서 이전 항목 삭제
Sheets("pro01").Select
Cells.Delete
'pro02 시트에서 이전 항목 삭제
Sheets("pro02").Select
Cells.Delete
'pro03 시트에서 이전 항목 삭제
Sheets("pro03").Select
Cells.Delete
'lmem 시트로 돌아가기
Sheets("lmem").Select
'하향으로 Final Memory (text, independent) 길이 결정
a = 3
Do Until IsEmpty(Cells(a, 1))
a = a + 1
Loop
a = a - 1
'Final Memory를 lmem 시트로 복사
Range("A3:A" & a & "").Copy
Sheets("pro01").Select
Range("A1").Select
ActiveSheet.Paste
'알파벳 분할
Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, FieldInfo:= _
Array(Array(0, 1), Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1) _
, Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1) _
, Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array(29, 1) _
, Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1) _
, Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array(46, 1), Array(47, 1), Array(48, 1), Array(49, 1) _
, Array(50, 1), Array(51, 1), Array(52, 1), Array(53, 1), Array(54, 1), Array(55, 1), Array(56, 1), Array(57, 1), Array(58, 1), Array(59, 1), Array(60, 1)) _
, TrailingMinusNumbers:=True
'하향으로 데이터 세트의 끝 찾기
b = 1
Do Until IsEmpty(Cells(b, 1))
b = b + 1
Loop
b = b - 1
'초기 길이 숫자 생성
Sheets("pro03").Cells(1, 1) = 1
m = Sheets("pro03").Cells(1, 1)
'시트 pro01로 가기
Sheets("pro01").Select
'가장 긴 열 길이를 갖는 행 숫자 찾기
e = 2
Do Until IsEmpty(Cells(e, 1))
c = 1
Do Until IsEmpty(Cells(e, c))
c = c + 1
Loop
c = c - 1
If c >= m Then
Sheets("pro03").Cells(1, 1) = c
m = Sheets("pro03").Cells(1, 1)
End If
e = e + 1
Loop
e = m
'제1 행 비우기
Rows("1:1").Clear
'헤더 넣기
f = 1
Do Until f = e + 1
Cells(1, f) = "" & f & ""
f = f + 1
Loop
'가장 왼쪽에서 열 삽입
Columns("A:A").Insert Shift:=xlToRight
'하향으로 데이터 세트의 끝 결정
a = 1
Do Until IsEmpty(Cells(a, 2))
a = a + 1
Loop
a = a - 1
'피봇 테이블링(정산 방식)
ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
Array("pro01!R1C1:R" & a & "C" & e + 1 & "", "Item1"), Version:=xlPivotTableVersion14). _
CreatePivotTable TableDestination:="'pro01'!R1C" & e + 4 & "", _
TableName:="PivotTable1", DefaultVersion:=xlPivotTableVersion14
ActiveSheet.PivotTables("PivotTable1").DataPivotField.PivotItems("Count of Value").Position = 1
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Value")
.Orientation = xlRowField
.Position = 2
End With
ActiveSheet.PivotTables("PivotTable1").PivotFields("Page1").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Column").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Row").Orientation = xlHidden
'하향에서 피봇 테이블의 끝 검출
i = 3
Do Until IsEmpty(Cells(i, e + 4))
i = i + 1
Loop
i = i - 1
'(blank)를 사용하지 않기 위해
If Cells(i - 1, e + 4) = "(blank)" Then
j = i - 2
Else: j = i - 1
End If
'피봇 테이블 내용을 오른쪽 옆으로 복사
Range(Cells(3, e + 4), Cells(j, e + 5)).Copy
Cells(3, e + 6).Select
ActiveSheet.Paste
'복사된 테이블을 더 큰 카운트에서 더 작은 카운트로 정렬
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(4, e + 7), Cells(j, e + 7)), _ SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01").Sort
.SetRange Range(Cells(3, e + 6), Cells(j, e + 7))
.Header = xlYes
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'정렬된 테이블을 lmem 시트로 복사
Range(Cells(4, e + 6), Cells(j, e + 7)).Copy
Sheets("lmem").Select
Range("E4").PasteSpecial Paste:=xlPasteValues
End Sub
Sub b_replace_word_to_address()
'단어를 주소로 대체하기 위한 모듈
'pro01 시트에서 이전 항목 삭제
Sheets("pro01").Select
Cells.Delete
'pro02 시트에서 이전 항목 삭제
Sheets("pro02").Select
Cells.Delete
'pro03 시트에서 이전 항목 삭제
Sheets("pro03").Select
Cells.Delete
'lmem 시트로 돌아가기
Sheets("lmem").Select
'하향에서 Final Memory (text, independent) 길이 결정
a = 3
Do Until IsEmpty(Cells(a, 1))
a = a + 1
Loop
a = a - 1
'Final Memory를 lmem 시트로 복사
Range("A3:A" & a & "").Copy
Sheets("pro01").Select
Range("A1").Select
ActiveSheet.Paste
'알파벳 분할
Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
OtherChar:="-", FieldInfo:=Array(Array(0, 1), Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1) _
, Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1) _
, Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array(29, 1) _
, Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1) _
, Array(40, 1), Array(41, 1), Array(42, 1), Array(43, 1), Array(44, 1), Array(45, 1), Array(46, 1), Array(47, 1), Array(48, 1), Array(49, 1) _
, Array(50, 1), Array(51, 1), Array(52, 1), Array(53, 1), Array(54, 1), Array(55, 1), Array(56, 1), Array(57, 1), Array(58, 1), Array(59, 1), Array(60, 1)) _
, TrailingMinusNumbers:=True
'lmem 시트로 돌아가기
Sheets("lmem").Select
'하향에서 Memory01 데이터의 끝을 결정
b = 3
Do Until IsEmpty(Cells(b, 5))
b = b + 1
Loop
b = b - 1
'Memory01 데이터를 pro02로 복사
Range(Cells(2, 5), Cells(b, 6)).Copy
Sheets("pro02").Select
Cells(2, 1).PasteSpecial Paste:=xlPasteValues
'주소 열 생성
c = 4
Do Until IsEmpty(Cells(c, 1))
Cells(c, 3) = ("R" & c & "C5")
c = c + 1
Loop
'pro01 시트로 가기
Sheets("pro01").Select
'하향으로 데이터 세트의 끝 결정
d = 1
Do Until IsEmpty(Cells(d, 1))
d = d + 1
Loop
d = d - 1
'초기 길이 숫자 생성
Sheets("pro03").Cells(1, 1) = 1
g = Sheets("pro03").Cells(1, 1)
'시트 pro01로 가기
Sheets("pro01").Select
'오른쪽으로 데이터 세트의 최대 길이 결정
e = 2
Do Until IsEmpty(Sheets("pro01").Cells(e, 1))
f = 1
Do Until IsEmpty(Sheets("pro01").Cells(e, f))
f = f + 1
Loop
f = f - 1
If f >= g Then
Sheets("pro03").Cells(1, 1) = f
g = Sheets("pro03").Cells(1, 1)
End If
e = e + 1
Loop
h = g '오른쪽으로 최대 길이 값
'단어를 주소 숫자로 대체
k = 4
Do Until IsEmpty(Sheets("pro02").Cells(k, 1))
'주소 명칭 정의
i = Sheets("pro02").Cells(k, 3)
'단어 명칭 정의
j = Sheets("pro02").Cells(k, 1)
'단어에서 주소로의 실제 대체
Range(Cells(1, 1), Cells(d, h)).Replace What:="" & j & "", Replacement:="" & i & "", LookAt:=xlWhole, SearchOrder:=xlByRows
k = k + 1
Loop
'결합된 주소 만들기
p = 2
Do Until IsEmpty(Sheets("pro01").Cells(p, 1))
'pro03 시트에서 이전 항목 삭제
Sheets("pro03").Cells.Delete
'모든 결합된 주소 시퀀스 만들기
Sheets("pro03").Cells(1, 1) = Sheets("pro01").Cells(p, 1)
m = 2
Do Until IsEmpty(Sheets("pro01").Cells(p, m))
Sheets("pro03").Cells(m, 1).FormulaR1C1 = "='pro03'!R" & m - 1 & "C1&"" ""&'pro01'!R" & p & "C" & m & ""
m = m + 1
Loop
'데이터 세트의 끝 검출
n = 1
Do Until IsEmpty(Sheets("pro03").Cells(n, 1))
n = n + 1
Loop
n = n - 1
'시퀀스를 수식에서 값으로 변환하고 pro01로 붙여넣기
Sheets("pro03").Cells(n, 1).Copy
Sheets("pro01").Cells(p, h + 2).PasteSpecial Paste:=xlPasteValues
p = p + 1
Loop
'결합된 주소 데이터 세트의 끝 검출
q = 2
Do Until IsEmpty(Sheets("pro01").Cells(q, h + 2))
q = q + 1
Loop
q = q - 1
'결합된 주소 세트를 lmem 시트
Range(Cells(2, h + 2), Cells(q, h + 2)).Copy
Sheets("lmem").Select
Range("C4").Select
ActiveSheet.Paste
End Sub
Sub c_find_2_same_sequence()
'이 프로그램 세트의 핵심!!!
For x = 2 To 1000
y = 2 * x + 3
'pro01 시트에서 이전 항목 삭제
Sheets("pro01").Select
Cells.Delete
'pro03 시트에서 이전 항목 삭제
Sheets("pro03").Select
Cells.Delete
'타일 "combined" 넣기
Cells(1, 1) = "combined"
'lmem 시트로 돌아가기
Sheets("lmem").Select
'하향으로 열 C 데이터의 끝 검출
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, 3))
a = a + 1
Loop
a = a - 1
'이를 pro01 시트로 복사
Range(Cells(3, 3), Cells(a, 3)).Copy
Sheets("pro01").Select
Range("A1").PasteSpecial Paste:=xlPasteValues
'데이터 세트를 분할
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
Semicolon:=True, Comma:=True, Space:=True, Other:=True, OtherChar:= _
"-", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), _
TrailingMinusNumbers:=True
'초기 g 값 넣기
Sheets("pro03").Cells(1, 1) = 1
g = Sheets("pro03").Cells(1, 1)
'오른쪽으로 데이터 세트의 최대 길이 결정
e = 2
Do Until IsEmpty(Sheets("pro01").Cells(e, 1))
f = 1
Do Until IsEmpty(Sheets("pro01").Cells(e, f))
f = f + 1
Loop
f = f - 1
If f >= g Then
Sheets("pro03").Cells(1, 1) = f
g = Sheets("pro03").Cells(1, 1)
End If
e = e + 1
Loop
'페어링된 주소 배치
i = 2
Do Until IsEmpty(Sheets("pro01").Cells(i, 1))
t = 1
Do Until IsEmpty(Sheets("pro01").Cells(i, t))
t = t + 1
Loop
t = t - 1
If t > 1 Then
h = 2
Do Until IsEmpty(Sheets("pro01").Cells(i, h))
Cells(i, (g + 2) + (h - 2)) = "=R" & i & "C" & h - 1 & "&"" ""&R" & i & "C" & h & ""
h = h + 1
Loop
Else: Cells(i, g + 2) = "zzz"
End If
i = i + 1
Loop
'헤더 넣기
f = 1
Do Until f = g
Cells(1, g + 1 + f) = "" & f & ""
f = f + 1
Loop
'하향으로 데이터 세트의 끝 검출
j = 1
Do Until IsEmpty(Cells(j, g + 2))
j = j + 1
Loop
j = j - 1
'정산 방식으로 피봇 테이블링
ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
Array("pro01!R1C" & g + 1 & ":R" & j & "C" & g + 1 + g - 1 & "", "Item1"), Version:=xlPivotTableVersion14). _
CreatePivotTable TableDestination:="'pro01'!R1C" & g + 1 + g - 1 + 2 & "", TableName:= _
"PivotTable1", DefaultVersion:=xlPivotTableVersion14
ActiveSheet.PivotTables("PivotTable1").DataPivotField.PivotItems("Count of Value").Position = 1
ActiveSheet.PivotTables("PivotTable1").PivotFields("Page1").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Column").Orientation = xlHidden
ActiveSheet.PivotTables("PivotTable1").PivotFields("Row").Orientation = xlHidden
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Value")
.Orientation = xlRowField
.Position = 1
End With
'2개의 빈 행을 삭제
Range(Cells(1, 2 * g + 2), Cells(2, 2 * g + 3)).Delete Shift:=xlUp
'피봇 테이블의 끝 검출
p = 1
Do Until IsEmpty(Sheets("pro01").Cells(p, 2 * g + 3))
p = p + 1
Loop
p = p - 1
If Cells(p, 2 * g + 2) = "Grand Total" Then
p = p - 1
Else: p = p
End If
'오른쪽으로 피봇 테이블 복사
If Not Cells(p, 2 * g + 2) = "zzz" Then
Range(Cells(1, 2 * g + 2), Cells(p, 2 * g + 3)).Copy
Else: Range(Cells(1, 2 * g + 2), Cells(p - 1, 2 * g + 3)).Copy
End If
Cells(1, 2 * g + 5).Select
ActiveSheet.Paste
Selection.Columns.AutoFit
'내림차순으로 정렬
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(2, 2 * g + 6), Cells(p, 2 * g + 6)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("pro01").Sort
.SetRange Range(Cells(1, 2 * g + 5), Cells(p, 2 * g + 6))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'명칭변경
q = 2 * g + 5
'하향으로 데이터 세트의 끝 검출
aa = 1
Do Until IsEmpty(Cells(aa, q + 1))
aa = aa + 1
Loop
aa = aa - 1
'빈도 한계 숫자 정의
w = Sheets("para").Cells(x + 4, 2)
'빈도 X 셀보다 작은 시작 찾기
If aa = 2 Then
If w >= 2 Then
If Cells(aa, q + 1) <= w - 1 Then
r = 2
Else: r = 3
End If
Else: r = 3
End If
End If
If aa > 2 Then
If w >= 2 Then
For bb = 1 To aa
If Cells(bb, q + 1) <= w - 1 Then
cc = bb
bb = aa
Else: cc = aa + 1
End If
Next bb
r = cc
Else: r = aa + 1
End If
End If
If r > 2 Then
'빈도 X 셀의 끝 찾기
s = r
Do Until IsEmpty(Cells(s, q + 1))
s = s + 1
Loop
s = s - 1
'불필요한 빈도 삭제
If w >= 2 Then
Range(Cells(r, q), Cells(s + 500000, q + 1)).Delete Shift:=xlUp '<--- 50000은 여분의 버퍼임
End If
'레이어 ID 찾기 테이블을 위한 헤더 넣기
Cells(1, q + 3) = "1st C Position"
Cells(1, q + 4) = "Space Position"
Cells(1, q + 5) = "2nd C Position"
Cells(1, q + 6) = "End Position"
Cells(1, q + 7) = "1st layer#"
Cells(1, q + 8) = "2nd Layer#"
'제1 행의 수식을 입력
Cells(2, q + 3) = "=Find(""C"", rc[-3], 1)"
Cells(2, q + 4) = "=find("" "",rc[-4],1)"
Cells(2, q + 5) = "=find(""C"",rc[-5],rc[-1])"
Cells(2, q + 6) = "=len(rc[-6])"
Cells(2, q + 7) = "=mid(rc[-7],rc[-4]+1,rc[-3]-(rc[-4]+1))"
Cells(2, q + 8) = "=mid(rc[-8],rc[-3]+1,rc[-2]-rc[-3])"
'데이터 세트의 끝 검출
t = 1
Do Until IsEmpty(Sheets("pro01").Cells(t, q))
t = t + 1
Loop
t = t - 1
'제1 행을 다른 행에 복사
If t > 2 Then
Range(Cells(2, q + 3), Cells(2, q + 8)).Copy
Range(Cells(3, q + 3), Cells(t, q + 3)).PasteSpecial Paste:=xlAll
End If
'레이어 숫자를 수식에서 텍스트로 변환
Range(Cells(1, q + 7), Cells(t, q + 8)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
'레이어 숫자를 텍스트에서 값으로 변환
Range(Cells(1, q + 7), Cells(t, q + 7)).Select
Selection.TextToColumns Destination:=Cells(1, q + 7), DataType:=xlFixedWidth, _
OtherChar:="-", FieldInfo:=Array(0, 1), TrailingMinusNumbers:=True
Range(Cells(1, q + 8), Cells(t, q + 8)).Select
Selection.TextToColumns Destination:=Cells(1, q + 8), DataType:=xlFixedWidth, _
OtherChar:="-", FieldInfo:=Array(0, 1), TrailingMinusNumbers:=True
'데이터 세트를 제1 레이어 #로 그 후 제2 레이어 #로 정렬
If x > 2 Then
Range(Cells(1, q), Cells(t, q + 8)).Select
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(2, q + 7), Cells(t, q + 7)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(2, q + 8), Cells(t, q + 8)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01").Sort
.SetRange Range(Cells(1, q), Cells(t, q + 8))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'제1 레이어#에서 더 작은 레이어 숫자의 끝 검출
aa = 1
Do Until Cells(aa, q + 7) = 2 * x + 1
aa = aa + 1
If aa = t Then
Cells(aa, q + 7) = 2 * x + 1
End If
Loop
aa = aa - 1
'제2 레이어 #에서 더 작은 레이어 번호의 끝 검출
bb = 1
Do Until Cells(bb, q + 8) = 2 * x + 1
bb = bb + 1
If bb = t Then
Cells(bb, q + 8) = 2 * x + 1
End If
Loop
bb = bb - 1
find smaller one between aa and bb
If aa >= bb Then
cc = bb
Else: cc = aa
End If
'이전 레이어의 행만 삭제
If Not cc = 1 Then
Range(Cells(2, q), Cells(cc, q + 8)).Delete
End If
'데이터 세트의 끝 검출
t = 1
Do Until IsEmpty(Sheets("pro01").Cells(t, q))
t = t + 1
Loop
t = t - 1
'페어링의 카운트(쌍의 빈도)로 데이터 세트를 정렬
Range(Cells(1, q), Cells(t, q + 8)).Select
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("pro01").Sort.SortFields.Add Key:=Range(Cells(2, q + 1), Cells(t, q + 1)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("pro01").Sort
.SetRange Range(Cells(1, q), Cells(t, q + 8))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
'<<<<<<<<<<<<<<<<--------------------------------------------------------------------------------------------
'데이터 세트의 끝 검출
t = 1
Do Until IsEmpty(Sheets("pro01").Cells(t, q))
t = t + 1
Loop
t = t - 1
'정렬된 테이블을 lmem 시트로 복사
Range(Cells(2, q), Cells(t, q + 1)).Copy
Sheets("lmem").Select
Cells(4, y).Select '<-------------여기!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ActiveSheet.Paste
'---------------2개의 단어 셀을 하나로 대체하기 위한 모듈---------------------
'pro01 시트에서 이전 항목 삭제
Sheets("pro01").Select
Cells.Delete
'lmem 시트로 돌아가기
Sheets("lmem").Select
'determine the end of the data set at Final Memory (associated) column
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, 3))
a = a + 1
Loop
a = a - 1
'Final Memory (associated)를 pro01 시트로 복사
Range(Cells(3, 3), Cells(a, 3)).Copy
Sheets("pro01").Cells(1, 1).PasteSpecial Paste:=xlPasteValues
'pro01 시트로 가기
Sheets("pro01").Select
'열 A의 열 폭 조절
Columns("A:A").Columns.AutoFit
'lmem 시트로 돌아가기
Sheets("lmem").Select
'MemoryXX에서 데이터 세트의 끝 결정
b = 3
Do Until IsEmpty(Sheets("lmem").Cells(b, y)) '<-----------9는 변수여야 함
b = b + 1
Loop
b = b - 1
'MemoryXX를 pro01 시트로 복사
Range(Cells(3, y), Cells(b, y + 1)).Copy '<------------9 및 10은 변수여야 함
Sheets("pro01").Cells(1, 3).PasteSpecial Paste:=xlPasteValues
'pro01 시트로 가기
Sheets("pro01").Select
'열 A의 열 폭 조절
Columns("C:D").Columns.AutoFit
'타일 넣기
Cells(1, 5) = "MemoryXX address"
'하향에서 MemoryXX의 끝 검출
c = 1
Do Until IsEmpty(Sheets("pro01").Cells(c, 3))
c = c + 1
Loop
c = c - 1
'MemoryXX 주소 넣기
d = 2
Do Until IsEmpty(Sheets("pro01").Cells(d, 3))
Cells(d, 5) = "R" & d + 2 & "C" & y & "" '<----------------9는 변수여야 함
d = d + 1
Loop
'열 A에서 데이터 세트의 끝 검출
e = 1
Do Until IsEmpty(Sheets("pro01").Cells(e, 1))
e = e + 1
Loop
e = e - 1
'2개의 단어를 하나로 대체
f = 2
Do Until IsEmpty(Sheets("pro01").Cells(f, 5))
g = Sheets("pro01").Cells(f, 3)
h = Sheets("pro01").Cells(f, 5)
Range("A2:A" & e & "").Replace What:="" & g & "", Replacement:="" & h & "", LookAt:=xlPart, SearchOrder:=xlByRows
f = f + 1
Loop
'열 A에서 데이터 세트의 끝 검출
i = 1
Do Until IsEmpty(Sheets("pro01").Cells(i, 1))
i = i + 1
Loop
i = i - 1
'열 A를 lmem 시트에 복사
Range(Cells(1, 1), Cells(i, 1)).Copy
Sheets("lmem").Select
Range("C3").PasteSpecial Paste:=xlPasteValues
Else: x = 1000
End If
Next x
'lmeme 시트로 가기
Sheets("lmem").Select
Range("A1").Select
End Sub
Sub d_text_to_formula()
' formulatext Macro
For c = 1 To 1000
'case separation Final memory cooking and Mem02< cooking
If c = 1 Then
d = 3
Else: d = 2 * c + 3
End If
'데이터 세트의 끝 검출
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, d))
a = a + 1
Loop
a = a - 1
'공백을 &" "&로 대체
Range(Cells(4, d), Cells(a, d)).Replace What:=" ", Replacement:="&"" ""&", LookAt:=xlPart, SearchOrder:=xlByRows
'pro01 시트에서 이전 항목 삭제
Sheets("pro01").Select
Cells.Delete
'lmem 데이터를 to pro01 시트로 복사
Sheets("lmem").Select
Range(Cells(3, d), Cells(a, d)).Copy
Sheets("pro01").Select
Range("A1").Select
ActiveSheet.Paste
'열 폭 조절
Selection.Columns.AutoFit
'타일을 열 B로 넣기
Range("B1") = "with ="
'하향으로 데이터 세트의 끝 검출
b = 1
Do Until IsEmpty(Sheets("pro01").Cells(b, 1))
b = b + 1
Loop
b = b - 1
If Not b = 1 Then
'제1 수식 넣기
Range("B2").FormulaR1C1 = "=""=""&RC[-1]"
Range("B2").Copy
Range(Cells(2, 2), Cells(b, 2)).Select
ActiveSheet.Paste
'전체 열 B를 선택
Columns("B:B").Select
'수식을 값으로 변환
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
'텍스트를 갱신된 수식으로 변환
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlFixedWidth, _
OtherChar:="-", FieldInfo:=Array(0, 1), TrailingMinusNumbers:=True
'갱신된 수식을 lmem 시트로 복사
Range(Cells(2, 2), Cells(b, 2)).Copy
Sheets("lmem").Select
Cells(4, d).Select
ActiveSheet.Paste
Else: c = 1000
End If
Next c
'lmem 시트로 돌아가기
Sheets("lmem").Select
Range("A1").Select
End Sub
Sub e_formula_to_text()
'수식을 텍스트로 변환하여 주소가 보여지게 하는 모듈
For b = 1 To 1000
If b = 1 Then
c = 3
Else: c = 2 * b + 3
End If
'하향으로 데이터 세트의 끝 검출
a = 3
Do Until IsEmpty(Sheets("lmem").Cells(a, c))
a = a + 1
Loop
a = a - 1
If Not a = 3 Then
'목표 데이터 세트 선택
Range(Cells(4, c), Cells(a, c)).Select
'셀 내용 디스플레이를 결과에서 수식으로 변경
ActiveWindow.DisplayFormulas = True
'"="를 "(nothing)"로 대체
Selection.Replace What:="=", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows
'&" "&를 "(space)"로 대체
Selection.Replace What:="&"" ""&", Replacement:=" ", LookAt:=xlPart, SearchOrder:=xlByRows
'셀 내용을 다시 수식에서 결과로 변경
ActiveWindow.DisplayFormulas = False
Else: b = 1000
End If
Next b
'lmem 시트로 돌아가기
Sheets("lmem").Select
Range("A1").Select
End Sub

Claims (20)

  1. 복수의 문서로 구성된 심볼 정보를 압축하는 컴퓨터화된 방법으로서, 각각의 문서는 복수의 심볼을 가지며, 상기 방법은
    복수의 문서 중 제1 문서를 입력 문서로서 가지며, 컴퓨터에 의해 자동으로:
    (a) 복수의 심볼 쌍을 식별하는 단계 - 각각의 심볼 쌍이 입력 문서 내 두 개의 순차 심볼로 구성됨 - ,
    (b) 복수의 심볼 쌍의 각각의 고유 심볼 쌍에 대해, 고유 심볼 쌍의 등장 횟수를 식별하는 카운트를 업데이트하는 단계, 및
    (c) 고유 심볼 쌍에 대한 카운트가 임계값을 초과하는 경우, 압축된 문서가, 입력 문서로부터의 복수의 심볼 쌍 중 하나씩과 연관된 각각의 위치에서, 압축 딕셔너리에 의해 복수의 심볼 쌍 중 하나씩과 매칭되는 고유 심볼 쌍과 연관된 대체 심볼을 포함하도록 함으로써, 압축된 문서를 생성하는 단계를 포함하는, 컴퓨터화된 방법.
  2. 제1항에 있어서, 임계값은 2인, 컴퓨터화된 방법.
  3. 제1항에 있어서, 각자의 고유 심볼 쌍에 대한 카운트 순으로, 압축 딕셔너리를 정렬하는 단계를 더 포함하는, 컴퓨터화된 방법.
  4. 제3항에 있어서, 압축 딕셔너리로부터 임계값을 초과하지 않는 카운트를 갖는 모든 고유 심볼 쌍을 제거하고 임계값을 초과하는 카운트를 갖는 각각의 고유 심볼 쌍과 대체 심볼 간 압축 딕셔너리 내 연관관계를 만드는 단계를 더 포함하는, 컴퓨터화된 방법.
  5. 제1항에 있어서, 압축된 문서를 입력 문서로서 이용해, 단계 (a), (b) 및 (c)를 반복함으로써 추가 패스를 수행하는 단계를 더 포함하는, 컴퓨터화된 방법.
  6. 제5항에 있어서, 패스들 중 하나에 의해 만들어진 압축된 문서가 바로 이전 패스에 의해 생성된 압축된 문서에서 변경되지 않을 때까지 추가 패스를 수행하는 단계를 더 포함하는, 컴퓨터화된 방법.
  7. 제1항에 있어서, 제1 문서로부터의 각각의 심볼은 단어를 가리키는, 컴퓨터화된 방법.
  8. 제7항에 있어서, 단계 (a) 전에, 텍스트 문서의 각각의 단어를 복수의 심볼의 대응하는 하나의 심볼로 대체함으로써, 제1 문서를 생성하는 단계를 더 포함하는, 컴퓨터화된 방법.
  9. 제1항에 있어서, 제1 문서의 각각의 심볼이 문숫자 캐릭터를 가리키는, 컴퓨터화된 방법.
  10. 제1항에 있어서, 각각의 대체 심볼은 항목이 대체 심볼과 연관된 고유 심볼 쌍을 저장하는 압축 딕셔너리 내 항목의 주소를 포함하는, 컴퓨터화된 방법.
  11. 제1항에 있어서, 복수의 문서의 나머지 문서 각각에서 단계 (a), (b) 및 (c)를 수행하는 단계를 더 포함하며, 심볼 쌍에 대한 각자의 카운트가 복수의 문서 중 임의의 문서에서 해당 심볼 쌍의 이전 등장 횟수를 식별하는, 컴퓨터화된 방법.
  12. 제11항에 있어서, 단계 (a) 및 (b)는, 단계 (c)가 복수의 문서 중 임의의 문서에서 수행되기 전에, 복수의 문서 각각에서 수행되는, 컴퓨터화된 방법.
  13. 제12항에 있어서, 단계 (c) 전에, 복수의 문서 중 임의의 문서에 대해, 고유 심볼 쌍이 임계값을 초과하는 카운트를 갖는 경우, 각각의 고유 심볼 쌍과 대체 심볼 간 압축 딕셔너리 내 연관관계를 만드는 단계를 더 포함하는, 컴퓨터화된 방법.
  14. 제11항에 있어서, 각자의 고유 심볼 쌍에 대한 카운트 순으로 압축 딕셔너리를 정렬하는 단계를 더 포함하는, 컴퓨터화된 방법.
  15. 제14항에 있어서, 압축 딕셔너리로부터 임계값을 초과하지 않는 카운트를 갖는 모든 고유 심볼 쌍을 제거하고 임계값을 초과하는 각각의 고유 심볼 쌍과 대체 심볼 간 압축 딕셔너리 내 연관관계를 만드는 단계를 더 포함하는, 컴퓨터화된 방법.
  16. 제11항에 있어서, 프로세스에 의해 이전에 생성된 압축된 문서를 입력 문서로서 이용해, 단계 (a), (b) 및 (c)를 반복함으로써 적어도 하나의 추가 패스를 만들기 위해 나머지 문서 각각에서 단계 (a), (b) 및 (c)를, 패스들 중 하나에 의해 생성된 압축된 문서가 바로 이전 패스에 의해 생성된 압축된 문서로부터 변경되지 않을 때까지, 반복하는 단계를 더 포함하는, 컴퓨터화된 방법.
  17. 제16항에 있어서, 고유 심볼 쌍과 연관된 대체 심볼이 제1 문서와 연관된 출력 문서에서 등장하는 빈도를 기초로 복수의 속성 중 적어도 하나의 속성을 제1 문서에 할당하는 단계를 더 포함하는, 컴퓨터화된 방법.
  18. 제17항에 있어서, 제1 문서의 적어도 하나의 속성 및 관련 문서의 적어도 하나의 속성을 기초로 관련된 문서를 제안하는 단계를 더 포함하는, 컴퓨터화된 방법.
  19. 복수의 문서로 구성된 심볼 정보를 압축할 수 있는 적어도 하나의 프로세서를 갖는 컴퓨터 시스템으로서, 각각의 문서는 복수의 심볼을 가지며, 컴퓨터 시스템은:
    복수의 문서 중 제1 문서를 입력 문서로서 가지며, 컴퓨터에 의해 자동으로:
    (a) 복수의 심볼 쌍을 식별하고 - 각각의 심볼 쌍이 입력 문서 내 두 개의 순차 심볼로 구성됨 - ,
    (b) 각각의 고유 심볼 쌍에 대해, 심볼 쌍의 등장 횟수를 식별하는 카운트를 업데이트하며,
    (c) 고유 심볼 쌍에 대한 카운트가 임계값을 초과하는 경우, 압축된 문서가, 입력 문서로부터의 복수의 심볼 쌍 중 하나씩과 연관된 각각의 위치에서, 압축 딕셔너리에 의해 복수의 심볼 쌍 중 하나씩과 매칭되는 고유 심볼 쌍과 연관된 대체 심볼을 포함하도록 함으로써, 압축된 문서를 생성하도록 프로그램된, 컴퓨터 시스템.
  20. 복수의 문서로 구성된 심볼 정보를 압축하기 위한 컴퓨터 명령의 세트를 저장하는 컴퓨터 판독형 저장 매체로서, 상기 컴퓨터 판독형 저장 매체는 일시적 전파 신호가 아니며, 각각의 문서는 복수의 심볼을 포함하고, 컴퓨터 명령의 세트는, 컴퓨터에서 실행될 때, 컴퓨터로 하여금 자동으로:
    복수의 문서 중 제1 문서를 입력 문서로서 가지며:
    (a) 복수의 심볼 쌍을 식별하고 - 각각의 심볼 쌍이 입력 문서 내 두 개의 순차 심볼로 구성됨 - ,
    (b) 각각의 고유 심볼 쌍에 대해, 심볼 쌍의 등장 횟수를 식별하는 카운트를 업데이트하며,
    (c) 고유 심볼 쌍에 대한 카운트가 임계값을 초과하는 경우, 압축된 문서가, 입력 문서로부터의 복수의 심볼 쌍 중 하나씩과 연관된 각각의 위치에서, 압축 딕셔너리에 의해 복수의 심볼 쌍 중 하나씩과 매칭되는 고유 심볼 쌍과 연관된 대체 심볼을 포함하도록 함으로써, 압축된 문서를 생성하도록 하는, 컴퓨터 판독형 저장 매체.
KR1020197037620A 2017-05-19 2018-05-18 데이터 압축 및 분석을 위한 컴퓨터화된 방법 KR20200018469A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/600,495 US10387377B2 (en) 2017-05-19 2017-05-19 Computerized methods of data compression and analysis
US15/600,495 2017-05-19
PCT/US2018/033510 WO2018213783A1 (en) 2017-05-19 2018-05-18 Computerized methods of data compression and analysis

Publications (1)

Publication Number Publication Date
KR20200018469A true KR20200018469A (ko) 2020-02-19

Family

ID=64271772

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020197037620A KR20200018469A (ko) 2017-05-19 2018-05-18 데이터 압축 및 분석을 위한 컴퓨터화된 방법

Country Status (7)

Country Link
US (2) US10387377B2 (ko)
EP (1) EP3635586A4 (ko)
JP (1) JP2020521408A (ko)
KR (1) KR20200018469A (ko)
CA (1) CA3061826A1 (ko)
SG (1) SG10201913378TA (ko)
WO (1) WO2018213783A1 (ko)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11741121B2 (en) * 2019-11-22 2023-08-29 Takashi Suzuki Computerized data compression and analysis using potentially non-adjacent pairs
CN111782660A (zh) * 2020-07-17 2020-10-16 支付宝(杭州)信息技术有限公司 基于键值存储的数据压缩的方法和系统
US11758022B2 (en) * 2020-09-24 2023-09-12 Servicenow, Inc. Compression of machine-generated data
WO2023091765A1 (en) * 2021-11-22 2023-05-25 Takashi Suzuki Computerized systems and methods of data compression

Family Cites Families (52)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01286627A (ja) * 1988-05-13 1989-11-17 Mitsubishi Electric Corp 情報の符号化・復号化方式
JP3038223B2 (ja) * 1990-02-26 2000-05-08 富士通株式会社 データ圧縮方式
US5260693A (en) 1991-10-11 1993-11-09 Spacelabs Medical, Inc. Method and system for lossless and adaptive data compression and decompression
US5995954A (en) 1992-03-18 1999-11-30 Loos; Hendricus G. Method and apparatus for associative memory
US5389922A (en) 1993-04-13 1995-02-14 Hewlett-Packard Company Compression using small dictionaries with applications to network packets
JP3132293B2 (ja) * 1993-06-22 2001-02-05 セイコーエプソン株式会社 データ圧縮方法、データ復元方法及び情報処理装置
WO1995018996A2 (en) 1993-12-30 1995-07-13 Connectix Corporation Lossless data compression system and method
US5884269A (en) 1995-04-17 1999-03-16 Merging Technologies Lossless compression/decompression of digital audio data
US5704060A (en) 1995-05-22 1997-12-30 Del Monte; Michael G. Text storage and retrieval system and method
US5594435A (en) 1995-09-13 1997-01-14 Philosophers' Stone Llc Permutation-based data compression
US6414610B1 (en) * 1997-02-24 2002-07-02 Rodney J Smith Data compression
US6356660B1 (en) 1997-10-15 2002-03-12 Hewlett-Packard Co. Method for compressing raster data
US6054943A (en) 1998-03-25 2000-04-25 Lawrence; John Clifton Multilevel digital information compression based on lawrence algorithm
DE19838788A1 (de) * 1998-08-26 2000-03-09 Siemens Ag Geregelter optischer Verstärker
CA2345722A1 (en) * 1998-09-28 2000-04-06 Albert Edge Determining resistance to treatment for hepatitis c virus
IL127434A0 (en) 1998-12-07 1999-10-28 Rdc Comm Ltd Apparatus and methods for real time lossless compression
US6597812B1 (en) 1999-05-28 2003-07-22 Realtime Data, Llc System and method for lossless data compression and decompression
US6400289B1 (en) 2000-03-01 2002-06-04 Hughes Electronics Corporation System and method for performing lossless data compression and decompression
US6804401B2 (en) 2000-05-12 2004-10-12 Xerox Corporation Method for compressing digital documents with control of image quality subject to multiple compression rate constraints
US6856651B2 (en) * 2000-07-25 2005-02-15 Peribit Networks, Inc. System and method for incremental and continuous data compression
US20020152219A1 (en) * 2001-04-16 2002-10-17 Singh Monmohan L. Data interexchange protocol
US20020154040A1 (en) 2001-04-23 2002-10-24 Pentti Vataja Lossless data compression method enabling fast decompression
US6735673B2 (en) * 2002-01-10 2004-05-11 Hewlett-Packard Development Company, L.P. Apparatus and methods for cache line compression
US6674908B1 (en) 2002-05-04 2004-01-06 Edward Lasar Aronov Method of compression of binary data with a random number generator
US6720894B2 (en) 2002-05-29 2004-04-13 Broadcom Corporation Method of and system for performing differential lossless compression
US7428341B2 (en) 2003-05-27 2008-09-23 Zaxel Systems, Inc. Method and apparatus for lossless data transformation with preprocessing by adaptive compression, multidimensional prediction, multi-symbol decoding enhancement enhancements
JP4091577B2 (ja) * 2004-07-20 2008-05-28 株式会社東芝 強誘電体メモリ
TWI318058B (en) * 2005-01-26 2009-12-01 Qisda Corp Message compression method, system and machine-readable storage medium
SE530081C2 (sv) 2005-10-24 2008-02-26 Algotrim Ab Metod och system för datakomprimering
US7576606B2 (en) * 2007-07-25 2009-08-18 D2Audio Corporation Digital PWM amplifier having a low delay corrector
US7365658B2 (en) 2006-02-28 2008-04-29 The Board Of Trustees Of The University Of Arkansas Method and apparatus for lossless run-length data encoding
US8108204B2 (en) 2006-06-16 2012-01-31 Evgeniy Gabrilovich Text categorization using external knowledge
US7991724B2 (en) 2006-12-21 2011-08-02 Support Machines Ltd. Method and a computer program product for providing a response to a statement of a user
CN100595596C (zh) 2007-12-12 2010-03-24 北京四方继保自动化股份有限公司 电网广域测量系统(wams)中动态数据压缩存储方法
US8326605B2 (en) * 2008-04-24 2012-12-04 International Business Machines Incorporation Dictionary for textual data compression and decompression
KR101023536B1 (ko) 2008-07-17 2011-03-21 고려대학교 산학협력단 데이터 무손실 압축 방법
US9298722B2 (en) 2009-07-16 2016-03-29 Novell, Inc. Optimal sequential (de)compression of digital data
US9438413B2 (en) * 2010-01-08 2016-09-06 Novell, Inc. Generating and merging keys for grouping and differentiating volumes of files
US20110173133A1 (en) 2010-01-11 2011-07-14 Augustine Adebayo Ojo Securities data analysis and prediction tool
JP2012124878A (ja) * 2010-11-17 2012-06-28 Sony Corp 画像処理装置及び画像処理方法
US8373584B2 (en) 2011-05-16 2013-02-12 Hewlett-Packard Development Company, L.P. Compressing and decompressing data
US9775661B2 (en) * 2011-07-19 2017-10-03 Illuminoss Medical, Inc. Devices and methods for bone restructure and stabilization
US9603235B2 (en) * 2012-07-27 2017-03-21 Massachusetts Institute Of Technology Phase-lock loop synchronization between beam orbit and RF drive in synchrocyclotrons
US20140282205A1 (en) * 2013-03-14 2014-09-18 Eugene Teplitsky Apparatus, system and method for electronic book reading
JP2016052046A (ja) * 2014-09-01 2016-04-11 株式会社東芝 圧縮装置、伸長装置およびストレージ装置
JP6467937B2 (ja) 2015-01-21 2019-02-13 富士通株式会社 文書処理プログラム、情報処理装置および文書処理方法
JP6256883B2 (ja) * 2015-03-25 2018-01-10 国立大学法人 筑波大学 データ圧縮・解凍システム、データ圧縮方法及びデータ解凍方法、並びにデータ圧縮器及びデータ解凍器
JP6540308B2 (ja) * 2015-07-13 2019-07-10 富士通株式会社 符号化プログラム、符号化方法、符号化装置、復号化プログラム、復号化方法および復号化装置
US20170013994A1 (en) * 2015-07-16 2017-01-19 C.A. Ronan & Co., Inc. Multiple height platform
US10169361B2 (en) * 2015-11-16 2019-01-01 International Business Machines Corporation Columnar database compression
US9973521B2 (en) * 2015-12-28 2018-05-15 International Business Machines Corporation System and method for field extraction of data contained within a log stream
JP6523195B2 (ja) * 2016-03-17 2019-05-29 株式会社東芝 データ圧縮システム及び方法

Also Published As

Publication number Publication date
JP2020521408A (ja) 2020-07-16
US11269810B2 (en) 2022-03-08
WO2018213783A1 (en) 2018-11-22
CA3061826A1 (en) 2018-11-22
SG10201913378TA (en) 2020-02-27
EP3635586A4 (en) 2021-03-03
US20190286618A1 (en) 2019-09-19
US20180336217A1 (en) 2018-11-22
US10387377B2 (en) 2019-08-20
EP3635586A1 (en) 2020-04-15

Similar Documents

Publication Publication Date Title
US7257530B2 (en) Method and system of knowledge based search engine using text mining
US8577882B2 (en) Method and system for searching multilingual documents
KR20200018469A (ko) 데이터 압축 및 분석을 위한 컴퓨터화된 방법
US10353925B2 (en) Document classification device, document classification method, and computer readable medium
CN110851559B (zh) 数据元自动识别方法和识别系统
US9798776B2 (en) Systems and methods for parsing search queries
CN108875065B (zh) 一种基于内容的印尼新闻网页推荐方法
CN113961685A (zh) 信息抽取方法及装置
CN109993216B (zh) 一种基于k最近邻knn的文本分类方法及其设备
CN112287069A (zh) 基于语音语义的信息检索方法、装置及计算机设备
CN109522396B (zh) 一种面向国防科技领域的知识处理方法及系统
WO2021190662A1 (zh) 医学文献排序方法、装置、电子设备及存储介质
KR101379128B1 (ko) 사전 생성 장치, 사전 생성 방법 및 사전 생성 프로그램을 기억하는 컴퓨터 판독 가능 기록 매체
US20100185438A1 (en) Method of creating a dictionary
JP2019185478A (ja) 分類プログラム、分類方法、および情報処理装置
CN108475265B (zh) 获取未登录词的方法与装置
US20220107919A1 (en) Computerized systems and methods of data compression
CN108733733B (zh) 基于机器学习的生物医学文本分类方法、系统和存储介质
CN115203445A (zh) 多媒体资源搜索方法、装置、设备及介质
CN114297449A (zh) 内容查找方法、装置、电子设备及计算机可读介质及产品
CN113157857B (zh) 面向新闻的热点话题检测方法、装置及设备
CN109947947B (zh) 一种文本分类方法、装置及计算机可读存储介质
CN113495964A (zh) 三元组的筛选方法、装置、设备及可读存储介质
JP2008282328A (ja) テキスト分類装置、テキスト分類方法及びテキスト分類プログラム並びにそのプログラムを記録した記録媒体
WO2023091765A1 (en) Computerized systems and methods of data compression

Legal Events

Date Code Title Description
E902 Notification of reason for refusal
E601 Decision to refuse application