Перейти к содержимому

Фильтрация по ключевым словам в списках блокировки

Хотя большинство пользователей используют Tisane для контекстно-зависимой модерации, некоторым пользователям по той или иной причине требуется простая фильтрация по ключевым словам.

Tisane можно использовать для мониторинга списков слов, при этом имеются опции, помогающие избежать обычных ошибок мониторинга списков слов.

Включение разбивки слов в ответ

По умолчанию, Tisane выподит в ответе только разделы abuse, sentiment и entities_summary. Однако Tisane может предоставить разбивку слов, составляющих каждое предложение.

Чтобы вывести слова, добавьте "words":true в параметр settings.

Все слова токенизированы (разделены на части); используемый алгоритм токенизации зависит от языка. Для пользователя очевидно, используются ли в языке пробелы или нет, есть ли в нем сложные слова (например, в немецком или голландском) или есть ли в нем слова, между которыми есть пробелы (например: kung fu на аглийском или EE. UU. на испанском).

Результатом является структурированный массив с именем words. Он расположен внутри структуры sentence_list в ответе.

Каждый элемент слова содержит:

  • фактическую строку (text);
  • offset, где она начинается;
  • флаг stopword для стоп-слов;
  • некоторые внутренние идентификаторы Tisane (см. Вариант 2 ниже);
  • сопутствующие особенности, такие как грамматика или стиль.

Реализация фильтрации ключевых слов

Существует два способа реализации фильтрации ключевых слов с помощью Tisane:

  • Вариант 1. Простой (не рекомендуется)
  • Вариант 2. Более мощный

Оба подхода позволяют избежать ложных срабатываний, известных как «проблема clbuttic» (замена ругательств более допустимыми словами).

Вариант 1. Простой (не рекомендуется)

Простое и очевидное решение:

  1. Просмотр массива words.
  2. Для каждого элемента проверьте, содержит ли атрибут text содержит одно из запрещенных слов (или выражений, поскольку токенизация является логической, и reyuae или * электростанция* — это одно слово).

Ограничения

Простота имеет свои недостатки:

  • Что произойдет при склонении слова? Некоторые скажут: «Мы можем использовать корень», но не всегда возможно свести слово к корню.
  • Как мы улавливаем слово bought _ на английском языке на основе леммы_buy ? Если вы предположите, что b является его основой, нужно ли вам предположить, что каждое слово, начинающееся с b является склоняемой формой buy?
  • Более морфологически богатые языки (французский, немецкий, арабский, русский, хинди и т. д.) имеют гораздо большее разнообразие и многочисленные склонения.
  • Что произойдет, если слово написать немного по-другому, например U.S.A. вместо USA или email вместо e-mail ?
  • Что произойдет, если слово будет запутано или, выражаясь языком информационной безопасности, будут использованы «конкурентные текстовые манипуляции»?
  • Что, если мы хотим отсеять любое упоминание об Alaska (штат), но разрешить Alaska Air и запеченная аляска ? (Недавний пример из реальной жизни — статья о Эноле Гей была удалена в ходе Зачистки Пентагона в 2025 году (Поскольку при сопоставлении ключевых слов было отмечено слово «гей»).

Вариант 2. Более мощный

Вариант 2 основан на внутренних идентификаторах Tisane. Этот путь позволяет устранить все перечисленные выше недостатки, используя возможности алгоритмической речи Tisane, а также возможности дешифровки и морфологического анализа.

Внутренние идентификаторы в записях слов: lexeme и family.

О лексемном идентификаторе

Идентификатор лексемы в Tisane связывется со словом и всеми его возможными склонениями.

Если слово запутано (например, «br*«k» вместо «break») или неправильно написано, и Tisane удается распознать исходное слово, то предоставляется идентификатор лексемы исходного слова.

О семейном идентификаторе

Семейный идентификатор — еще один вариант, если мы хотим фильтровать по смыслу слова.

Например: Устройство, которое в США называют «elevator», в Великобритании называют «lift». Это одно и то же реальное явление, просто разные термины. У них обоих одинаковый семейный идентификатор. Однако lift в смысле аэродинамической подъемной силы имеет другое семейственное обозначение.

Дополнительным бонусом является то, что семейные идентификаторы одинаковы на всех языках. То есть вы можете создать «список понятий», которые нужно зафиксировать, независимо от языка или диалекта.

Опытные пользователи могут даже фильтровать по категориям. Например: Любой вид самолета, любой вид автомобиля, любой вид птицы, игнорируя «глиняного голубя», но поймав «голубя» и т. д.

Почему мы рекомендуем использовать идентификатор лексемы

Однако, хотя Tisane в целом ориентирован на смысл слова, мы пришли к выводу, что разница между смыслами слова не всегда очевидна для пользователей. Кроме того, фильтрация ключевых слов обычно намеренно игнорирует контекст. Вот почему мы рекомендуем использовать идентификатор лексемы.

Для каждого слова или фразы в вашем списке:

  1. Найдите идентификатор лексемы, либо запустив пример предложения и получив из него идентификатор лексемы, либо воспользовавшись нашим API прямого доступа к языковой модели.
  2. Просмотрите масссив words.
  3. Для каждого слова сравните идентификатор лексемы со списком ваших идентификаторов лексем.

Например:

Запрос (sentiment, topics, и entities выключено для упрощения вывода):

{
  "language":"en",
  "content":"d/l star t*k for free",
  "settings":
  {
    "snippets":true,
    "words":true,
    "sentiment":false,
    "entities":false,
    "topics":false
  }
}

Ответ:

{
	"text": "d/l star t*k for free",
	"sentence_list": [
		{
			"offset": 0,
			"text": "d/l star t*k for free",
			"words": [
				{
					"type": "word",
					"offset": 0,
					"text": "d/l",
					"role": "verb",
					"lexeme": 44058,
					"family": 117658,
					"grammar": [
						"VERB"
					]
				},
				{
					"type": "word",
					"offset": 4,
					"text": "star t*k",
					"role": "patient",
					"lexeme": 317071,
					"family": 152100,
					"wikidata": "Q1092",
					"grammar": [
						"PROPN"
					]
				},
				{
					"type": "word",
					"offset": 13,
					"text": "for free",
					"lexeme": 62119,
					"family": 93462,
					"grammar": [
						"ADV"
					]
				}
			],
			"corrected_text": "d/l star trek for free"
		}
	]
}

В ответе:

  1. Запутанное слово Star Trek:
  • представлено как единое целое
  • ему присвоен идентификатор лексемы 317071
  • ему присвоен семейный идентификатор 152100
  1. Атрибут corrected_text attribute содержит деобфусцированную версию предложения: d/l star trek for free.