텍스트 덩어리에서 일반적인 문구를 발견하기위한 기술/도구는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1426383

  •  07-07-2019
  •  | 
  •  

문제

내가 10000 개의 이메일 바디를 가지고 있으며 2000 년에는 "빠른 갈색 여우가 게으른 개 위로 점프한다"또는 "Lorem Ipsum Dolor Sit Amet"과 같은 아비 라이트 일반 문자열이 포함되어 있다고 가정 해 봅시다. 이 문구를 "광산"하기 위해 어떤 기술을 사용할 수 있습니까? 나는 한 단어 나 짧은 문구를 채굴하는 데 관심이 없습니다. 또한 이미 알고있는 문구를 필터링해야합니다.

예시:

string mailbody1 = "Welcome to the world of tomorrow! This is the first mail body. Lorem ipsum dolor sit AMET. Have a nice day dude. Cya!";
string mailbody2 = "Welcome to the world of yesterday! Lorem ipsum dolor sit amet Please note this is the body of the second mail. Have a nice day.";
string mailbody3 = "A completely different body.";
string[] mailbodies = new[] {mailbody1, mailbody2, mailbody3};
string[] ignoredPhrases = new[] {"Welcome to the world of"};

string[] results = DiscoverPhrases(mailbodies, ignoredPhrases);

이 예에서는 DiscoverPhrases 기능이 "Lorem Ipsum Dolor Sit Amet"과 "좋은 하루 되세요"를 반환하기를 원합니다. 함수가 더 짧은 "노이즈"문구를 반환하는 경우 그다지 중요하지는 않지만 가능하다면 프로세스에서이를 제거하는 것이 좋을 것입니다.

편집 : 예제에 MailBody3을 포함하는 것을 잊었습니다.

도움이 되었습니까?

해결책

살펴보십시오 N-그램. 가장 일반적인 문구는 반드시 가장 일반적인 기여를합니다. N-그램. 나는 Trigrams라는 단어로 시작하여 그것이 어디로 이어지는 지 볼 것입니다. (필요한 공간은입니다 N 텍스트의 길이를 곱하므로 N 너무 커지십시오.) 카운트가 아닌 위치를 저장하면 트리 그램을 확장하여 공통 문구를 형성 할 수 있는지 확인할 수 있습니다.

다른 팁

이것이 당신이 원하는지 확실하지 않지만 체크 아웃 가장 긴 일반적인 서브 스트링 문제 그리고 Diff 유틸리티 알고리즘.

단어 경계에 관심이 있는지에 따라 이와 같은 것이 효과가있을 수 있습니다. 의사 코드에서 (어디서 LCS 컴퓨팅 기능입니다 가장 긴 일반적인 후속):

someMinimumLengthParameter = 20;
foundPhrases = [];

do {
    lcs = LCS(mailbodies);
    if (lcs in ignoredPhrases) continue;

    foundPhrases += lcs;

    for body in mailbodies {
        body.remove(lcs);
    }    
} while(lcs.length > someMinimumLengthParameter);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top