2013-03-01 1 views
1

Я хочу найти термин Frequency and Invert Document Frequency (TF-IDF) для текстовых файлов в определенной коллекции файлов.Как удалить и подсчитать слова из текстового файла?

Так что в этом случае я просто хочу, чтобы вычислить общее количество слов в файле, количество вхождений данного слова в файле и удалить такие слова, как a, an, the и т.д.

Есть ли синтаксический анализатор в vb.net?
Спасибо заранее.

+0

пройти через это [учебник] (http://www.codeproject.com/Questions/302262/How-to-search-specific-string-into- text-file-from) и дайте мне знать, если это поможет. –

ответ

1

Самый простой способ я знаю, что-то вроде:

Private Function CountWords(Filename as String) As Integer 
    Return IO.File.ReadAllText(Filename).Split(" ").Count 
End Function 

Если вы хотите удалить слова, которые вы можете:

Private Sub RemoveWords (Filename as String, DeleteWords as List(Of String)) 
    Dim AllWords() As String = IO.File.ReadAllText(Filename).Split(" ") 
    Dim RemainingWords() As String = From Word As String In AllWords 
            Where DeleteWords.IndexOf(Word) = -1 

    'Do something with RemainingWords ex: 
    'IO.File.WriteAllText(Filename, String.Join(vbNewLine, RemainingWords) 
End Sub  

Это предположить, что слова разделены пробелом

0

Может regular expressions бы помочь вам:

Using System.IO 
Using System.Text.RegularExpressions 

... 

Dim anyWordPattern As String = "\b\w+\b" 
Dim myWordPattern As String = "\bMyWord\b" 
Dim replacePattern As String = "\b(?<sw>a|an|the)\b" 
Dim content As String = File.ReadAllText(<file name>) 
Dim coll = Regex.Matches(content, anyWordPattern) 
Console.WriteLine("Total words: {0}", coll.Count) 
coll = Regex.Matches(content, myWordPattern, RegexOptions.Multiline Or RegexOptions.IgnoreCase) 
Console.WEriteLine("My word occurrences: {0}", coll.Count) 
Dim replacedContent = Regex.Replace(content, replacePattern, String.Empty, RegexOptions.Multiline Or RegexOptions.IgnoreCase) 
Console.WriteLine("Replaced content: {0}", replacedContent) 

Объяснение для регулярных выражений используется:

  • \ Ь - граница слова;
  • \ w - любое слово-символ;
  • + - квантор, 1 или много;
  • (? ...) - именованная группа, называемая "SW" - остановка слово
  • | ап | в - альтернативы, "а" или "ЭН" или ""
1

Самый простой способ сделать это, чтобы прочитать текстовый файл в одну строку, а затем использовать рамки .NET, чтобы найти спичку:

Dim text As String = File.ReadAllText("D:\Temp\MyFile.txt") 
Dim index As Integer = text.IndexOf("hello") 
If index >= 0 Then 
    ' String is in file, starting at character "index" 
End If 

или раствор 2 Вам нужно StreamReader и Regx для этого.

//read file content in StreamReader 
StreamReadertxt Reader = new StreamReader(fName); 
szReadAll = txtReader.ReadToEnd();//Reads the whole text file to the end 
txtReader.Close(); //Closes the text file after it is fully read. 
txtReader = null; 
//search word in file content 
if (Regex.IsMatch(szReadAll, "SearchME", RegexOptions.IgnoreCase))//If the match is found in allRead 
    MessageBox.Show("found"); 
else 
    MessageBox.Show("not found"); 

Все, я надеюсь, что это разрешит ваши запросы. С уважением

0

Вы могли бы попробовать что-то вроде этого:

Dim text As String = IO.File.ReadAllText("C:\file.txt") 
Dim wordsToSearch() As String = New String() {"Hello", "World", "foo"} 
Dim words As New List(Of String)() 
Dim findings As Dictionary(Of String, List(Of Integer)) 

'Dividing into words' 
words.AddRange(text.Split(New String() {" ", Environment.NewLine()}, StringSplitOptions.RemoveEmptyEntries)) 
'Discarting all the words you dont want' 
words.RemoveAll(New Predicate(Of String)(AddressOf WordsDeleter)) 

findings = SearchWords(words, wordsToSearch) 

Console.WriteLine("Number of 'foo': " & findings("foo").Count) 

И функции используются:

Private Function WordsDeleter(ByVal obj As String) As Boolean 
    Dim wordsToDelete As New List(Of String)(New String() {"a", "an", "then"}) 
    Return wordsToDelete.Contains(obj.ToLower) 
End Function 

Private Function SearchWords(ByVal allWords As List(Of String), ByVal wordsToSearch() As String) As Dictionary(Of String, List(Of Integer)) 
    Dim dResult As New Dictionary(Of String, List(Of Integer))() 
    Dim i As Integer = 0 

    For Each s As String In wordsToSearch 
     dResult.Add(s, New List(Of Integer)) 

     While i >= 0 AndAlso i < allWords.Count 
      i = allWords.IndexOf(s, i) 
      If i >= 0 Then dResult(s).Add(i) 
      i += 1 
     End While 
    Next 

    Return dResult 
End Function 
Смежные вопросы