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

Astraport

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

doc

Client
Регистрация
30.03.2012
Сообщения
8 649
Благодарностей
4 618
Баллы
113
в регулярках есть такая штука \b - граница слова. С её помощью преобразовать стопслова и проверить через Regex.IsMatch
 
  • Спасибо
Реакции: Astraport

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 952
Благодарностей
4 376
Баллы
113
Спасибо, но работает через раз. Вроде находит и сразу ошибка.

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;
                        }
                    }
Кстати, как с логов ПМ можно скопировать ошибки?
 
Последнее редактирование:

Nord

Client
Регистрация
22.03.2012
Сообщения
2 388
Благодарностей
1 455
Баллы
113
  • Спасибо
Реакции: Astraport

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Код:
    //Если черная фраза короче
                     //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

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 952
Благодарностей
4 376
Баллы
113

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 952
Благодарностей
4 376
Баллы
113
И не уверен что будет работать. Нужно точное вхождение ЧС фразы, а сплит разрушит взаимосвязь между словами.
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
И не уверен что будет работать. Нужно точное вхождение ЧС фразы, а сплит разрушит взаимосвязь между словами.
белую фразу перед проверкой или чистить от всего что не числа буквы пробелы или разбивать по знакам на строки и в Contains(пробелы добавлять)
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 952
Благодарностей
4 376
Баллы
113
Я не могу понять почему это выражение постоянно выдает false?

PHP:
return Regex.IsMatch("wer tdse, rrty dfg", "\bwer\b");
Со статикой и @ работает. Как @ юзать с переменными?
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 952
Благодарностей
4 376
Баллы
113
О, вот так работает!
PHP:
string str = "\\b" + "td" + "\\b";
return Regex.IsMatch("wer tdse, rrty dfg", @str);
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 649
Благодарностей
4 618
Баллы
113
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

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 952
Благодарностей
4 376
Баллы
113
Да, всё верно, но ещё добавил проверку на количество слов в stop_words, если их более одного, то предварительно вычисляю isFind из Contains для надежности.
 

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