Поиск по стоп-словам

  • Автор темы Автор темы Astraport
  • Дата начала Дата начала

Astraport

Client
Регистрация
01.05.2015
Сообщения
5 084
Реакции
4 633
Баллы
113
Есть фраза и есть список стоп-слов (не обязательно одно).
Нужно найти вхождения стоп-слов в фразу.
Вроде просто, можно либо фразу разбить пробелами и знаками препинаний в массив и в цикле проверить stop_words.Contains(word) для каждого слова фразы, но как быть если стоп слово состоит из двух слов? Не сработает.
Можно наоборот циклом phrase.Contains( stop_words), но тут тоже проблема. Например стоп-слово to может быть в сотне "хороших" слов типа tomorrow. Добавить пробелы не решает задачи, т. к. слово может быть вначале или конце фразы и обрамляться знаками препинаний.
 
Спасибо, но работает через раз. Вроде находит и сразу ошибка.

2018-08-02_21-33-45.png

PHP:
Развернуть Свернуть Копировать
string [] titles = title.Split(' ');
                    Boolean isFind = false;
                    for (int i = 0; i < titles.Length; i++) {
                        if (Regex.IsMatch(stop_words,  "^(.*?(\\b" + titles[i] + "\\b)[^$]*)$")) {
                     
                            isFind = true;
                            break;
                        }
                    }

Кстати, как с логов ПМ можно скопировать ошибки?
 
Последнее редактирование:
Код:
Развернуть Свернуть Копировать
    //Если черная фраза короче
                     //string mainphrase = "1word 2words 3word 4words";
                     //string blackphrase = "1words 2word 3words";
                   
                         //Если черная фраза длиннее
                       string mainphrase = "1words 2word 3words";
                       string blackphrase = "1word 2words 3word 4words";
       

                        //Первый этап проверки методом 69 - фраза в фразе
                        if(mainphrase.Contains(blackphrase))
                        {
                            return "Black";
                        }
                        else if(blackphrase.Contains(mainphrase))
                        {
                            return "Black";
                        }
                       
                        //Фразы в массивы
                        string[] mainArr = mainphrase.Split(' ');       
                        string[] blackArr = blackphrase.Split(' ');
                               
                        int blackCount = 0;//Счетчик вхождений
                           
                            for(int m = 0; m < mainArr.Length; m++) //Фраза по которой происходил сбор       
                            {
                               
                                if(blackphrase.Contains(mainArr[m])) //Проверяем есть-ли слово из главной фразы в черной фразе       
                                {
                                    blackCount++;    //Если есть, то плюс один к счетчику
                                }       
                                else       
                                {       
                                    for(int b = 0; b < blackArr.Length; b++)//Фраза из списка результатов       
                                    {           
                                        if(mainphrase.Contains(blackArr[b]))   
                                        {       
                                            blackCount++;    //Если есть, то плюс один к счетчику   
                                            break;
                                        }           
                                    }       
                                }   
                   
                                if(blackCount == mainArr.Length || blackCount == blackArr.Length)                       
                                {                                         
                                    return "Black";       
                                }   
                       
                            }
                            return blackCount;
 
  • Оценить
Реакции: Astraport
И не уверен что будет работать. Нужно точное вхождение ЧС фразы, а сплит разрушит взаимосвязь между словами.
 
И не уверен что будет работать. Нужно точное вхождение ЧС фразы, а сплит разрушит взаимосвязь между словами.
белую фразу перед проверкой или чистить от всего что не числа буквы пробелы или разбивать по знакам на строки и в Contains(пробелы добавлять)
 
Я не могу понять почему это выражение постоянно выдает false?

PHP:
Развернуть Свернуть Копировать
return Regex.IsMatch("wer tdse, rrty dfg", "\bwer\b");

Со статикой и @ работает. Как @ юзать с переменными?
 
C#:
Развернуть Свернуть Копировать
string text = "hello terry";
var stopwords_list = project.Lists["stopwords_list"];


Boolean isFind = false;
for(int i=0; i<stopwords_list.Count; i++)

    string stopword_pattern = @"(?i)\b" + Regex.Escape(stopwords_list[i]) + @"\b";
  
    if (Regex.IsMatch(text,  stopword_pattern)
    {
        isFind = true;
        break;
    }
}

return isFind;
 
  • Оценить
Реакции: SergSh и Astraport
Да, всё верно, но ещё добавил проверку на количество слов в stop_words, если их более одного, то предварительно вычисляю isFind из Contains для надежности.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)