Я пытаюсь классифицировать статьи по сохраненным ключевым словам. У меня есть список ключевых слов для категории, и я хочу, чтобы статье присваивалась категория с наибольшим количеством ключевых слов.
For Each keyword As String In category.Keywords
category.tempCount += Regex.Matches(article.Item("title").InnerXml, Regex.Escape(keyword)).Count
category.tempCount += Regex.Matches(article.Item("description").InnerXml, Regex.Escape(keyword)).Count
Next
И это делается для каждой категории, запускаемой для каждой статьи. Я пытаюсь отсортировать список, чтобы сказать, какая категория является лучшей для этой статьи. Однако возможно, что более одной категории является лучшей, и что ни одна из этих категорий не подходит. Так что запуск этого не помог мне:
Categories.Sort(
Function(article1 As ArticleCategory, article2 As ArticleCategory)
Return article1.tempCount.CompareTo(article2.tempCount)
End Function)
Может, я все делаю неправильно, но пока думаю, что я на правильном пути. (У меня также есть сравнение по умолчанию в классе Category, оно просто не работает).
Я получаю исключение при сортировке, которая, скорее всего, вызвана тем, что они не уникальны.
Исключением, которое я получаю, является исключение InvalidOperationException: не удалось сравнить два элемента в массиве. Это с использованием компаратора, который я встроил в ArticleClass
Imports System.Xml
Class ArticleCategory
Implements IComparer(Of ArticleCategory)
Public ReadOnly key As Int32
Public ReadOnly Name As String
Public ReadOnly Keywords As List(Of String)
Public tempCount As Integer = 0
Public Sub New(ByVal category As XmlElement)
key = System.Web.HttpUtility.UrlDecode(category.Item("ckey").InnerXml)
Name = System.Web.HttpUtility.UrlDecode(category.Item("name").InnerXml)
Dim tKeywords As Array = System.Web.HttpUtility.UrlDecode(category.Item("keywords").InnerXml).Split(",")
Dim nKeywords As New List(Of String)
For Each keyword As String In tKeywords
If Not keyword.Trim = "" Then
nKeywords.Add(keyword.Trim)
End If
Next
Keywords = nKeywords
End Sub
'This should be removed if your using my solution.
Public Function Compare(ByVal x As ArticleCategory, ByVal y As ArticleCategory) As Integer Implements System.Collections.Generic.IComparer(Of ArticleCategory).Compare
Return String.Compare(x.tempCount, y.tempCount)
End Function
End Class